gpt4 book ai didi

c++ - 如果在派生类中将私有(private)虚函数重写为公共(public)函数,会出现什么问题?

转载 作者:太空狗 更新时间:2023-10-29 19:40:18 27 4
gpt4 key购买 nike

using namespace std;
#include <cstdio>
#include <iostream>

class One{
private:
virtual void func(){
cout<<"bark!"<<endl;
}
};

class Two: public One{
public:
void func(){
cout<<"two!"<<endl;
}
};

int main(){
One *o = new Two();
o->func();
}

为什么 o->func() 会出错?

我不知道它背后的机制......在我看来,o->func() 应该调用派生类中的func(),这是公开的,所以不会有问题,但它说:

 error: ‘virtual void One::func()’ is private

最佳答案

可访问性检查是根据对象的静态类型进行的。 o 的类型是One*。这意味着如果 One::func()private,则 o->func() 将无法编译。

另一方面,根据对象的动态类型,将调用哪个虚拟成员函数(即动态调度)发生在运行时。所以如果 One::func()publico->func() 将调用 Two::func(),因为 o 指向 Two 类型的对象。

对于您的示例代码和用例,使 One::func() private 毫无意义。但请注意,有一个著名的成语叫做Non-Virtual Interface。 , 它利用基类的 private 虚成员函数。


其他建议:

  1. 不要忘记delete o;
  2. 在基类一个中添加一个虚析构函数。否则 delete o; 将导致未定义的行为;例如Two 的析构函数可能不会被调用。

    class One {
    public:
    virtual ~One() {}
    // ...
    };

关于c++ - 如果在派生类中将私有(private)虚函数重写为公共(public)函数,会出现什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41136606/

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