抽象类与继承 来自C++的代码> java/的味道,我试图把我的头脑围绕在C++的OOP模型上。我已经读过了:建议如何在C++中设计接口。上述代码是作者阐述的规则的直接应用(或其细微变化)。我的问题是,上面的代码是否会生成“thisx”后跟“thatyy”?我感到困惑的是,作者建议将virtual与private结合使用。我的推理是,如果一个函数是私有的,我们怎么能覆盖它呢? 在上面的代码中,Y可以用作赋值的右侧,因为我们从接口公开派生。当我们对它调用someFunction()时,由于我们没有在类Y中显式提供任何实现,它会使用类X中的实现吗?然后,如果它这样做了,它会查看doThat()并再次使用Ys实现它?
代码有一些问题。以下是一个工作示例:抽象类与继承 来自C++的代码> java/的味道,我试图把我的头脑围绕在C++的OOP模型上。我已经读过了:建议如何在C++中设计接口。上述代码是作者阐述的规则的直接应用(或其细微变化)。我的问题是,上面的代码是否会生成“thisx”后跟“thatyy”?我感到困惑的是,作者建议将virtual与private结合使用。我的推理是,如果一个函数是私有的,我们怎么能覆盖它呢? 在上面的代码中,Y可以用作赋值的右侧,因为我们从接口公开派生。当我们对它调用someFunction()时,由于我们没有在类Y中显式提供任何实现,它会使用类X中的实现吗?然后,如果它这样做了,它会查看doThat()并再次使用Ys实现它?,c++,oop,C++,Oop,代码有一些问题。以下是一个工作示例: class MyInterface { public: virtual void someFunction()= 0; }; class X: public MyInterface { private: virtual void doThis() { printf("This X"); } virtual void doThat() { printf("That X"); } publ
class MyInterface {
public:
virtual void someFunction()= 0;
};
class X: public MyInterface {
private:
virtual void doThis() {
printf("This X");
}
virtual void doThat() {
printf("That X");
}
public:
void someFunction() {
doThis();
doThat();
}
};
class Y: public MyInterface, private X {
private:
void doThat() {
printf("That Y");
}
};
MyInterface *iface= new Y();
Y->someFunction();
解释
classy:public X
才能使用void X::someFunction()的实现
遗憾的是C++中没有真实的接口,而且只使用纯虚拟类的解决方案。这种双亲解决方案有其自身的局限性(见下文)。因此,在接口定义中添加析构函数也是一个好主意
使用classy:public MyInterface,private X时,需要提供MyInterface::someFunction()
的自定义实现。您有两个父类和两个父类中的someFunction()
(X
和MyInterface
)。即使只有一个函数实现,这也是必要的。因此,您需要指定将使用哪个父类“实现”。错误:
“Y”:无法实例化抽象类
删除接口时也会出现错误(尝试从X
使用接口)。原因很简单,当X
是私有的时,实现不是公共的,不能用作接口
“类型转换”:存在从“Y*”到“MyInterface*”的转换,但无法访问
Y->someFunction()中的类型代码>
实际上,该代码不会编译,因为您正在用
Y*
初始化MyInterface
。
class MyInterface
{
public:
virtual ~MyInterface() { }
virtual void someFunction() = 0;
};
class X : public MyInterface
{
private:
virtual void doThis()
{
printf("This X\n");
}
virtual void doThat()
{
printf("That X\n");
}
public:
void someFunction()
{
doThis();
doThat();
}
};
class Y : public X
{
private:
void doThat()
{
printf("That Y\n");
}
};
int main()
{
MyInterface *iface = new Y();
iface->someFunction();
delete iface;
}