gpt4 book ai didi

c++ - 虚函数被覆盖且私有(private),公共(public)说明符

转载 作者:行者123 更新时间:2023-11-28 00:07:55 29 4
gpt4 key购买 nike

我很惊讶 public (或 private )虚函数可以被 private 覆盖(或 public )虚函数。见下文,

class C{
public:
virtual void f(){cout<<"C"<<endl;}
void g(){f();}

};
class D:public C{
private:
virtual void f(){cout<<"D"<<endl;}
};

int main(){
C * c = new D;
c->g();
return 0;
}

代码输出 D .我认为虚函数可以在派生类中使用与基类中相同的访问说明符来覆盖,但这显然不是上面代码的工作方式,我是否观察到错误?为什么访问说明符(publicprotectedprivate)不限制虚函数的覆盖方式?

最佳答案

C++11 标准在 10.3 Virtual Functions 中没有提到任何关于虚函数访问说明符的内容,至少我找不到。

鉴于此,D::f() 不能通过类型为 D 的对象或指针直接访问。

D* dPtr = new D;
dPtr->f(); // Does not work.

以下作品:

C* cPtr = new D;
cPtr->f();

因为 C::f()C 的公共(public)成员函数。

更新

经过进一步调查,我发现了以下内容:

11.5 Access to virtual functions

1 The access rules (Clause 11) for a virtual function are determined by its declaration and are not affected by the rules for a function that later overrides it. [ Example:

class B {
public:
virtual int f();
};

class D : public B {
private:
int f();
};

void f() {
D d;
B* pb = &d;
D* pd = &d;
pb->f(); // OK: B::f() is public,
// D::f() is invoked
pd->f(); // error: D::f() is private
}

— end example ]

关于c++ - 虚函数被覆盖且私有(private),公共(public)说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486508/

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