【问题标题】:Call method of dynamic type, not static one [duplicate]动态类型的调用方法,而不是静态的[重复]
【发布时间】:2019-11-25 11:26:21
【问题描述】:

我有这个sn-p:

#include <iostream>
#include <vector>

class A {
public:
    void m() {
        std::cout << "hi";
    }
};

class B : public A {
public:
    void m() {
        std::cout << "hello";
    }
};

int main() {
    std::vector<A*> v;
    v.push_back(new A);
    v.push_back(new B);
    v.push_back(new A);
    for (A *obj : v)
        obj->m();
}

问题是这个程序打印hihihi而不是hihellohi,这意味着它总是调用静态类型(即A)的m()方法而不是动态方法(B )。怎么总是调用动态类型的m()方法呢?

感谢您的帮助。

【问题讨论】:

  • 然后声明virtual void m()
  • 如果您了解静态类型和动态类型,那么您肯定了解虚函数吗?

标签: c++ type-conversion


【解决方案1】:

为了具有多态行为,基类函数应该是虚拟的:

class A {
public:
    virtual void m() {  // <-- You missed this virtual
        std::cout << "hi";
    }
};

对于派生类,它应该被覆盖:

class B : public A {
public:
    void m() override {
        std::cout << "hello";
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多