如果我从基类私下继承派生类,我无法获得继承类的多态性。
但是我可以在派生类中获得“this”指针的多态性。
我很好奇为什么允许'this'指针多态到它的私有父级,但是,类外的指针却不允许。
提前致谢!
#include <iostream>
class Shape
{
public:
virtual void say() const = 0;
virtual void who()
{
std::cout << "Shape" << std::endl;
}
void whoAmI() {
this->who();
}
};
class Squire : private Shape
{
public:
virtual void say() const
{
std::cout << "Squire" << std::endl;
}
void doSay()
{
// why this pointer to Shape type is allowed in class?
privateSay(this);
}
private:
void privateSay(Shape* s)
{
s->say();
}
};
void say(Shape* s)
{
s->say();
}
int main(int argc, const char * argv[]) {
// insert code here...
Squire* s = new Squire();
// allowed
s->doSay();
// not allowd, compile errors
// Cannot cast 'Squire' to its private base class 'Shape'
say(s);
return 0;
}
=========
编辑以澄清。感谢所有的答案。为了澄清我的问题,我认为如果 C++ 允许这种行为,我可能会稍微违反封装。
一个更清晰的案例:
#include <iostream>
class Base
{
public:
void baseFunc() const
{
std::cout << "baseFunc" << std::endl;
}
};
class Worker
{
public:
Worker(Base *pBase)
{
base_ = pBase;
}
void breakFunc() const
{
base_->baseFunc();
}
private:
Base *base_;
};
class Derived : private Base
{
public:
void init()
{
worker_ = new Worker(this);
}
Worker* getWorker()
{
return worker_;
}
private:
Worker *worker_;
};
int main()
{
Derived derived;
derived.init();
Worker *worker = derived.getWorker();
worker->breakFunc();
}
Base 类的对象只作为父对象部分存在于 Derived 类的对象中,而 Derived 类的继承者是私有的 Base 类,也就是说 Derived 类的对象有一个基类的对象,私有的。
上面的代码违反了Derived 类的封装规则,但是在编译过程中甚至没有给出警告。
我认为在这种情况下应该使用显式强制转换,或者在编译时给出警告。