//Parent.h
class Parent
{
public:
virtual void foo() = 0;
};
//Child.h
class Child : public Parent
{
public:
virtual void foo(){cout << "inside function foo()" << endl;}
virtual void bar(){cout << "inside function bar()" << endl;};
};
int main( int argc, char** argv ){
Parent* pa = new Child;
pa->foo();
pa->bar(); //Error, class Parent have no member bar
return 0;
}
除了将这些功能添加到Parent
类
答案 0 :(得分:2)
您可以将指针声明为子类型。你仍然可以将它传递给期望父指针的函数。
其他解决方案涉及使用dynamic_cast<Child>(pa)
,虽然这通常被视为需要这样做的糟糕设计,因为它会破坏多态性应该完成的任务。
答案 1 :(得分:1)
您首先要在课程设计中更加小心,以避免此错误。
是的,如果类型相关,您可以使用dynamic_cast
或static_cast
向[{1}}指针投射Base
指针,就像它们在这里一样。但让我们考虑一下。
问:为什么要使用多态? A:为类似操作提供不同的行为,在运行时选择行为。
Polymorphism用于从该操作的 provision 中抽象出操作的实现。例如,所有Derived
都有许多方面。多少边取决于实际的形状,但我们不应该知道什么样的Shape
什么是为了问它有多少边。我们应该可以问它。
问:为什么您通常需要使用Shape
?
A:因为基指针不提供您需要的设施。
如果我们不应该关心某个对象是什么类型dynamic_cast
以便执行我们需要的操作,那么为什么Shape
接口永远不会提供任何设施呢?需要?
当我们在设计某些东西时犯了错误时就会发生这种情况。 Shape
中没有足够的或正确的设施,或者某个特定的Shape
子类正在尝试做更多的工作。
这就是你在这里所做的。如果Shape
对其采用{Parent
)public
方法没有意义,那么bar()
也没有意义。如果Child
对其采用Child
方法有意义,那么bar
实际上不是Child
,是吗?
也许Parent
应该是其他课程中的方法。
答案 2 :(得分:1)
首先我们需要知道编译器为什么抱怨!!如果有人告诉你修复,你永远不会知道原因。首先要了解原因。
您在编译期间收到错误。在vTable
期间vPtr
和early binding
没有出现。它出现在late binding
中。基类没有bar方法,所以编译器抱怨你基类调用的方法未知。因此,您需要将其类型转换为派生类指针,以便传递early binding
。我希望我对这个问题的理解是正确的。如果我错了,请纠正我。
答案 3 :(得分:0)
您可以使用static或dynamic_cast。 dynamic_cast示例:
if (Child* child = dynamic_cast<Child*>(pa))
child->bar();