我有一个基类和两个派生自它的类。我在基类中有几个虚函数,所以我创建了一个指向基类的指针,并使用这个指针来访问这些方法。
现在我想使用指向派生类对象的基类指针来访问派生类的成员变量(此类变量在基类中不存在)。
可以这样做吗?应该这样做吗?
答案 0 :(得分:7)
为什么要访问派生类的界面?当您使用多态时,您不需要关心基类引用/指针背后的内容。 如果你这样做,那通常暗示了设计缺陷。
您要做的是“开启型”。 (“如果B*
后面是D1
对象,请执行此操作,否则执行此操作”。)开启类型可以规避多态性和不良符号。
注意:有一种方法可以做到这一点(dynamic_cast
),但由于上述原因,我认为这是一种不好的做法,不会详细说明。
答案 1 :(得分:1)
是的,你可以这样做,但不建议这样做。您可以使用dynamic_cast将基类指针强制转换为派生类指针,并获取派生类中的变量。
例如,如果你有一个名为Base的基类和两个派生类Derived1和Derived2,如果你有Base* p
指针,那么你可以这样做:
Derived1* d1 = dynamic_cast<Derived1*>(p);
答案 2 :(得分:1)
编写一个虚函数,它将在每个类中相应地执行,并在您实际“需要”访问变量的位置 - 调用该函数。就这么简单。
答案 3 :(得分:0)
将该变量移动到基类。当实现静态多态时,Base类需要调用Derived类的方法(或使用变量)的唯一情况是Curiously recurring template pattern。在其他情况下,它看起来很糟糕。