这个问题在这里已有答案:
我一直在玩继承,我尝试过这段代码:
#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:
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 ++标准并未对派生类强加任何要求,以将重写虚函数置于任何特定的可访问范围内。这意味着,基类可以声明受保护的虚方法,并且派生类可以在public / protected / private范围中实现该方法,并且代码仍然是合法的并且将起作用。