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();
基于Java
的OOP风格,我试图将头衔围绕C ++的OOP模型。我已阅读以下内容:http://www.gotw.ca/publications/mill18.htm,以获取有关如何在C ++中设计接口的建议。上面的代码是作者阐述的规则的直接应用(或其微小变化)。我的问题是,上面的代码是否会产生“ This X”和“ That Y”?我感到困惑的是,作者建议将virtual
与private
结合使用。我的推断是,如果一个函数为private
,我们该如何覆盖它?
在上面的代码中,由于我们是从接口公开派生的,因此可以将Y
用作赋值的右侧。当我们在其上调用someFunction()
时,由于我们没有在class Y
内显式提供任何实现,它将使用class X
中的实现吗?然后,只要有,它就会查看doThat()
并再次使用Y
的实现?
答案 0 :(得分:0)
代码有一些问题。这是一个工作示例:
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;
}
您需要使用class Y : public X
才能使用void X::someFunction()
的实现
不幸的是,C ++中没有真正的接口,只有使用纯虚拟类的解决方法。有两个父母的解决方法有其自身的局限性(请参见下面的内容)。因此,在接口定义中添加析构函数也是一个好主意。
使用class Y: public MyInterface, private X
时,需要提供MyInterface::someFunction()
的自定义实现。您有两个父类,并且两个父(someFunction()
和X
)中都有MyInterface
。即使只有一种功能实现,这也是必要的。因此,您需要指定将使用哪个父类“实现”。错误:
'Y':无法实例化抽象类
删除接口(尝试使用X
中的接口)时也会出错。原因很简单,当X
为私有时,实现不是公开的,因此不能用作接口。
“类型转换”:存在从“ Y *”到“ MyInterface *”的转换,但无法访问
您正在使用类作为Y->someFunction();
我不知道为什么您可以覆盖私有虚拟函数。我现在主要在C#中工作,而C ++的这一“功能”是我无法理解的。没错,这应该是错误的代码,但是(至少在Visual Studio 2017中有效)。
我也想知道,为什么这不被认为是错误/不正确的代码构造。