我有两个类,如下所示:
class A
{
public:
A();
~A();
virtual void func() { cout << "this is A class" << endl; };
};
和:
class B:public A
{
public:
B();
~B();
virtual void func() { cout << "this is B class" << endl; };
virtual void funcky() { cout << "How to print this method?" << endl; };
};
这是我的主菜:
include "B.h"
void main()
{
A* a;
a = new B;
}
现在我的问题是如何打印方法"funcky"?(主要不生成B对象。)
我认为这与动态选角有关,但我不确定。
一个初步注释:由于A
类是派生的,所以它确实应该有一个虚拟析构函数。如果没有,A* a = new B; delete a;
将不会调用B
析构函数。
然后,即使在这样一个简单的例子中,它也没有多大意义,你想要的是动态铸造。它有点粗糙,但存在于标准中,当您解耦接口和实现时,它是有意义的。当实现类中的方法接收到指向接口的指针时,它会使用动态转换将其转换为实际类并使用私有方法。
在您的示例中,您应该简单地使用:
B* b = dynamic_cast<B *>(a);
if (b != nullptr) {
b->funcky();
}
但是,当您发现自己在使用动态铸造时,您应该始终怀疑您是否在异常地使用多态性。。。