从基类指针调用子类方法?

时间:2015-11-09 23:04:07

标签: c++ polymorphism override

我不知道作为标题提供什么,我希望更有经验的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对象?以及如何实现它?

3 个答案:

答案 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,virtualpublic:,因为默认情况下它是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类功能。

您可以使用覆盖和虚拟关键字来执行此操作。

http://en.cppreference.com/w/cpp/language/override