我有三个类,每个类都继承自另一个:A 由 B 继承,B 由 C 继承。我在这些类中的每一个中都有一个虚函数。我想创建一个包含 C 类对象的 A 类指针,并像这样调用 B 类函数:
class A
{
public:
virtual void doStuff() = 0;
};
class B : public A
{
public:
virtual void doStuff() override;
};
class C : public B
{
public:
void doStuff() override;
};
void B::doStuff()
{
std::cout << "Starting doStuff in B\n";
doStuff();
std::cout << "Ending doStuff in B\n";
}
void C::doStuff()
{
std::cout << "doStuff in C\n";
}
int main()
{
A *pointer = new C();
pointer->B::doStuff(); // This doesn't work
}
如果我稍微改变我的 main,我会得到正确的输出:
int main()
{
B *pointer = new C(); // Changed A to B
pointer->B::doStuff();
}
输出
Starting doStuff in B
doStuff in C
Ending doStuff in B
如何更改我的原始代码以使用 A 类指针并且最好只使用一个函数名称?
最佳答案
问题是 B::doStuff
不是 B
类中 doStuff
的实现,它不是 A
。如果您确定指针实际上指向 B
的实例或从 B
派生的对象,那么您可以编写以下内容:
int main()
{
A *pointer = new C();
reinterpret_cast<B*>(pointer)->B::doStuff(); // This should work
}
如果您不能确定实例类型,请使用 dynamic_cast
。
关于C++如何从main调用派生基类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435247/