首页 > 解决方案 > 基类被调用的方法

问题描述

我有以下代码:

#include<iostream>
using namespace std;

struct Base{
    void f(int x){
        cout<<"B";
    }
};
struct Derived: public Base {
    virtual void f(double x){
        cout<<"D";
    }
};

int main(){
Derived d;
int x = 5;
d.f(x);
Base *pb = &d;
pb->f(x);

}

它输出:DB
即使 pb 存储指向派生类的指针。为什么
Base调用类的方法?

标签: c++derived-class

解决方案


声明Derived::fvirtual 不会使Base::fvirtual,因此当您调用f指向Basethen 的指针时Base::f

您应该virtualBase. 然后它也会virtual在 中Derived,你不需要在virtual那里重复。在Derived你应该使用这样的override说明符:

struct Base{
    virtual void f(int x){
        cout<<"B";
    }
};
struct Derived: public Base {
    void f(double x) override {
        cout<<"D";
    }
};

override方法实际上不是override继承方法时,说明符有助于捕获错误。例如,对于上述情况,您将收到以下错误:

source>:10:10: error: 'void Derived::f(double)' marked 'override', but does not override
   10 |     void f(double x) override {
      |          ^

当您要覆盖时,参数类型必须匹配。

此代码打印预期的DD

#include <iostream>

struct Base {
    virtual void f(int x){
        std::cout << "B";
    }
};
struct Derived: public Base {
    void f(int x) override {
        std::cout << "D";
    }
};

请注意,如果您不使用,override那么此类错误可能会被忽视。当类定义如下:

struct Base{
    virtual void f(int x){
        std::cout<<"B";
    }
};
struct Derived: public Base {
    void f(double x) {
        std::cout<<"D";
    }
};

然后Derived::f不覆盖Base::f。它只是隐藏它,输出仍然是DB.

现场演示


推荐阅读