为什么不调用子类方法?

eSe*_*rus 10 c++ polymorphism class

我有子类化和使用方法的问题.

我创建了一个类的实例B并将其存储为指针A.但是当我使用指针调用重载方法时,输出是"A"而不是"B".为什么?

这适用于其他语言,我做错了什么?

#include <iostream>
using namespace std;

class A {
public:
    void f() {
        cout << "A";
    }
};

class B : public A {
public:
    void f() {
        cout << "B";
    }
};

int main() {
    A *a = new B();
    a->f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

sya*_*yam 21

f()需要virtual在基类A中声明:

class A {
public:
    virtual void f() {
        cout << "A";
    }
};
Run Code Online (Sandbox Code Playgroud)

您已经使用过的其他语言可能默认使用虚方法,但C++不支持(不支付您不使用的内容:虚方法在调用它们时会产生间接,这意味着它们比正常方法调用稍慢) .

通过添加virtual,绑定将被推迟到运行时(称为动态绑定),并且f()将根据类型决定哪个函数调用.

因为您没有将函数声明f()为虚拟,所以绑定是静态的(在编译时)并且将使用变量类型(但不是值)来确定f()要调用的函数.所以在你现在的代码中,语句a->f();调用A类是f()因为a是指向类的指针A.


Lih*_*ihO 6

为了实现多态行为,基类的方法必须是virtual.

所以在class A您需要更改void f()virtual void f().