我一直在研究继承,并且尝试了以下代码:
#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;
}
因此,我还尝试将protected
中的class Bar
关键字替换为private:
private:
void doSum() const
{
std::cout << "hi, i'm doing something" << std::endl;
}
和代码碰巧能正常工作...
所以我的问题是,如果在实现派生类时声明受保护的方法为私有方法,会有什么区别?如果是这样,它们是什么?我什至可以这样做吗?
答案 0 :(得分:1)
所以我的问题是,如果在实现派生类时将受保护的方法声明为私有,会有什么区别?
不。没有区别。不幸的是,C ++标准没有对派生类施加任何要求,以将覆盖的虚函数置于任何特定的可访问性范围内。这意味着,基类可以声明一个虚拟方法受保护,派生类可以在公共/保护/私有范围内实现该方法,并且代码仍然合法并且可以正常工作。
答案 1 :(得分:1)
所以我的问题是,如果在实现派生类时将受保护的方法声明为私有,会有什么区别?
是的
如果是,那是什么?
这将阻止下一级别的派生类能够调用派生类的实现。
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
//===========================
}
};
我什至允许这样做吗?
是的