我不知道作为标题提供什么,我希望更有经验的stackoverflow.com用户能够改进它。
假设我们有A类
class A {
void hello(){ cout << "i'm an A" << endl; }
}
及其子类B
class B: public A {
void hello(){ cout << "i'm a B" << endl; }
}
然后我们在程序中的某个地方做了
A* array[2];
array[0] = new A;
array[1] = new B;
array[0]->hello(); // output: "i'm an A"
array[1]->hello(); // output: "i'm a B"
为什么array[1].hello();
输出I'm a B
,因为我们为该基类指针实例化B
对象?以及如何实现它?
答案 0 :(得分:2)
您必须使hello
成为虚拟函数:
class A {
virtual void hello() { cout << "i'm an A" << endl; }
};
class B : public A {
virtual void hello() override { cout << "i'm a B" << endl; } // 1)
};
这告诉编译器实际函数不应该由静态类型(指针或引用的类型)确定,而是由对象的动态(运行时)类型确定。
1)override
关键字告诉编译器检查函数是否实际覆盖了基类中的hello
函数(有助于捕获拼写错误或参数类型的差异)。
答案 1 :(得分:2)
这里有一些变化:
在A类中创建函数hello,virtual
和public:
,因为默认情况下它是private
class A {
public:
virtual void hello(){ cout << "i'm an A" << endl; }
};
同样在班级B
virtual
class B: public A {
virtual void hello(){ cout << "i'm a B" << endl; }
};
答案 2 :(得分:0)
由于您在B类中继承了A类,派生类B将从Base类中调用该函数。您需要覆盖B类中的函数,因为您要更改Base类功能。
您可以使用覆盖和虚拟关键字来执行此操作。