gpt4 book ai didi

c++ - 隐藏在派生类中的虚函数

转载 作者:行者123 更新时间:2023-11-28 00:20:58 25 4
gpt4 key购买 nike

我有两个继承相关的类:-

class Base
{
public:
virtual void f(int x)
{
cout << "BASE::int" << endl;
}
virtual void f(double x)
{
cout << "BASE::double" << endl;
}
};

class Derived : public Base
{
public:
virtual void f(str::string s)
{
cout << "DERIVED::string" << endl;
}
};

我在派生类中提供了具有不同参数的相同方法。这意味着我没有覆盖,而是隐藏了这个函数的基类版本。因此,下面的电话对我来说是意料之中的,而且很清楚。

std::string str("Hello");
Base b;
b.f(1); //calls base class version.
b.f(str); //error.

Derived d;
d.f(1); //error.
d.f(str); //calls derived class version.

但我无法得到最后一个场景的说明。

Base *b = new Derived;
b->f(str); //results in error.

编译器不会使用 vtable 和 vptr 将此调用绑定(bind)到 f 的派生版本。但相反,它正在做其他事情。任何人都可以向我提供编译器如何根据语言机制尝试解析此调用的完整路径。

最佳答案

如果您的指针是 Base* 类型,那么您只能“看到”类 Base 中定义的成员。编译器不会(或假装不知道)该变量确实指向 Derived 的一个实例,即使您只是在上一行为其分配了一个实例。

当您将变量声明为 Base* 类型时,您是在告诉编译器:将其视为可以指向 Base派生自它的任何类。因此,您无法访问在特定派生类中定义的成员,因为无法保证指针实际指向该派生类的实例。

关于c++ - 隐藏在派生类中的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27498309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com