【发布时间】:2011-05-04 22:02:11
【问题描述】:
我昨天(在一些帮助下)完成了这样的编码:
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo(){cout << "A::foo\n";}
};
class B : private A
{
private:
virtual void foo(){ cout << "B::foo\n";}
void DoSomething(SomeOtherClass& o){o.DoSomething(*static_cast<A*>(this));}
};
我尝试改变继承方式:
class B : public A
{
private:
virtual void foo(){ cout << "B::foo\n";}
};
int main()
{
A* a = new B;
a->foo();
}
这仍然有效。我预计会出现编译时错误。请告诉我为什么这是可能的以及可能的用途是什么?由于第一种情况,我知道一种用途 - 您可以为不同的类公开不同的接口。
编辑:
在第二种情况下,输出为B::foo。
【问题讨论】:
-
您认为错误在哪里?关于将函数声明为私有?还是在函数的调用上?
-
我很感兴趣。希望有一个答案可以解释此功能的可能用途(?)。一种用法可能是强制程序员将类 B 实例化为指向基类 A 的指针,以便使用它的接口。但为什么那会是一件好事,我不知道。
-
@PigBen:在第二种情况下,我预计
foo中B的定义会出现错误。 -
@manneorama:检查我昨天发布的这个问题。正是从它我得到了这个:)。 stackoverflow.com/questions/4084772/…