【发布时间】:2009-09-01 09:16:31
【问题描述】:
我有一个基类和两个派生自它的类。我在基类中有几个虚函数,所以我创建了一个指向基类的指针并使用这个指针来访问这些方法。
现在我想使用指向派生类对象的基类指针访问派生类的成员变量(该变量在基类中不存在)。
这可以吗?应该这样做吗?
【问题讨论】:
标签: c++ polymorphism
我有一个基类和两个派生自它的类。我在基类中有几个虚函数,所以我创建了一个指向基类的指针并使用这个指针来访问这些方法。
现在我想使用指向派生类对象的基类指针访问派生类的成员变量(该变量在基类中不存在)。
这可以吗?应该这样做吗?
【问题讨论】:
标签: c++ polymorphism
为什么要访问派生类的接口?当您使用多态性时,您不需要关心基类引用/指针背后的内容。 如果你这样做了,那通常是设计缺陷的暗示。
您正在尝试做的是“开机类型”。 (“如果B* 后面是D1 对象,则执行此操作,否则执行此操作”。) 开启类型正在规避多态性和不好的迹象。
注意:有一种方法可以做到这一点 (dynamic_cast),但由于上述原因,我认为这是一种不好的做法,因此不会详细说明。
【讨论】:
是的,您可以这样做,但不建议这样做。您可以使用dynamic_cast将基类指针强制转换为派生类指针,并获取派生类中的变量。
例如,如果您有一个名为 Base 的基类和两个派生类 Derived1 和 Derived2,并且如果您有 Base* p 指针,那么您可以这样做:
Derived1* d1 = dynamic_cast<Derived1*>(p);
【讨论】:
编写一个虚函数,它会在每个类中以及在您实际“需要”访问变量的地方执行相应的操作 - 调用该函数。就这么简单。
【讨论】:
只需将该变量移至基类即可。当基类实现静态多态时,唯一需要调用派生类的方法(或使用变量)的情况是Curiously recurring template pattern。在其他情况下,它看起来像是糟糕的设计。
【讨论】: