受保护的方法在 c++ 中继承时可以成为私有方法
A protected method can become a private method when inherited in c++?
我一直在玩继承,我尝试了以下代码:
#include <iostream>
#include <string>
class Foo
{
public:
virtual void func() = 0;
protected:
virtual void doSum() const = 0;
};
class Bar : public Foo
{
public:
void func() {
doSum();
}
protected:
void doSum() const
{
std::cout << "hi, i'm doing something" << std::endl;
}
};
int main()
{
Foo* ptr = new Bar();
ptr->func();
return 0;
}
所以我也尝试将class Bar
中的 protected
关键字替换为 private 像这样:
private:
void doSum() const
{
std::cout << "hi, i'm doing something" << std::endl;
}
而且代码碰巧工作得一样...
所以我的问题是,如果我在实现派生类时声明受保护的方法私有,有什么区别吗?如果是这样,它们是什么?我甚至可以这样做吗?
所以我的问题是,如果我在实现派生类时声明受保护的方法私有,有什么区别吗?
是的。
如果是这样,它们是什么?
这将阻止下一级派生类能够调用派生类的实现。
class Foo
{
protected:
virtual void doSum() const = 0;
};
class Bar : public Foo
{
private:
void doSum() const
{
std::cout << "hi, i'm doing something" << std::endl;
}
};
class Baz : public Bar
{
public:
void doSum() const
{
//===========================
Bar::doSum(); // NOT ALLOWED
//===========================
}
};
我甚至可以这样做吗?
是的。
所以我的问题是,如果我在实现派生类时声明受保护的方法私有,有什么区别吗?
不。没有区别。遗憾的是,C++标准并没有对派生类施加任何要求,以将覆盖虚函数放置在任何特定的可访问性范围内。这意味着,基类可以声明一个受保护的虚拟方法,派生类可以在公共/受保护/私有范围内实现该方法,并且代码仍然是合法的并且可以工作。
相关文章:
- 我的类中有方法的指针数组,但我不能调用我的方法.代码如下
- C++ 中的类和方法继承
- 在我的示例中,实际上有一些C 继承问题
- 与其他模板方法继承 C++ 模板类
- 如何处理一个子类有方法,而另一个没有方法的子类?
- 有方法的类,我不明白类的外观
- 是否有方法为模板参数指定所需的定义
- C++类方法继承
- C++对象中的构造函数继承与方法继承
- 是否有方法将相对库路径添加到可执行文件以避免设置LD_library_path
- 类方法继承中的C++类
- 是否有方法将所有赋值运算符(+=、*=等)转发为隐式使用重写的直接赋值运算符(=)
- 是否有方法使用vector的内容作为键和自定义值来初始化unordered_map ?
- 在调用main函数之前,是否有方法解析命令行选项?
- 尽管有类继承,变量仍不可访问
- 在c++中是否有方法对成员变量(类)进行后期初始化?
- 是否有方法为任何指针类型定义转换操作符
- 是否有方法为窗口窗体中的特定按钮挂钩鼠标事件
- 是否有方法检测内联函数ODR违规
- 在Windows Vista+上不注册proppage.dll,是否有方法访问远程过滤器图?