C++ 从抽象(纯虚拟)类私下继承有意义吗?
假设这个构造C++ 从抽象(纯虚拟)类私下继承有意义吗?,c++,abstract-class,virtual-functions,private-inheritance,C++,Abstract Class,Virtual Functions,Private Inheritance,假设这个构造 struct InterfaceForFoo { virtual void GetItDone() = 0; }; class APoliticallyCorrectImplementationOfFooRelatedThings : private InterfaceForFoo { public: void GetItDone() { /*do the thing already*/ }; }; 现在,我想知道以这种方式从接口私下继承是否有任何
struct InterfaceForFoo
{
virtual void GetItDone() = 0;
};
class APoliticallyCorrectImplementationOfFooRelatedThings : private InterfaceForFoo
{
public:
void GetItDone() { /*do the thing already*/ };
};
现在,我想知道以这种方式从接口私下继承是否有任何有用的场景。不太可能。如果你需要一个函数,你就去实现它。强制其他类不能使用的函数是没有意义的 我不知道为什么你会从一个接口私下继承;这种做法违背了接口的目的 如果它不是一个接口,而是一个类,那么它是有意义的:
class A {
virtual void foo() = 0;
void bar() {
foo();
}
};
class B : private A {
virtual void foo() {
}
};
嗯??不,这毫无意义,因为您提供接口的原因是希望其他人通过该接口使用您的类。如果他们不知道你实施了它,那该怎么办
#include <vector>
class Fooable{
public:
virtual void foo() = 0;
};
class DoesFoo
: private Fooable
{
void foo();
};
int main(){
std::vector<Fooable*> vf;
vf.push_back(new DoesFoo()); // nope, doesn't work
vf[0]->foo();
}
#包括
班级餐饮{
公众:
虚拟void foo()=0;
};
类doesfo
:私人食品
{
void foo();
};
int main(){
std::向量vf;
vf.push_back(new doesfo());//不,不起作用
vf[0]>foo();
}
上面的例子不起作用,因为外界不知道
doesfo
是一个Fooable
,因此,在面向对象方面,您不能new
它的一个实例并将其分配给Fooable*
在抽象类的private
继承方面没有使用案例
但是,如果您希望强制您的子类必须派生某些方法,则可以使用此方法。例如:
struct implement_size
{
virtual size_t size () = 0;
};
class MyVector : private implement_size
{
public:
size_t size () { ... } // mandatory to implement size()
}
class MyString : private implement_size
{
public:
size_t size () { ... } // mandatory to implement size()
};
因此,它有助于维护个人编码规则。这个例子的信息是,继承不仅仅是为了面向对象的目的。你甚至可以(比如Java final)。嗯,这里的每个人都说“不”。我说“是的,这是有道理的。”
将继承设置为私有并不意味着不能从类外访问VirtualBase
的成员,它只意味着不能通过对Concrete
的引用访问这些成员。然而,Concrete
及其好友可以将Concrete
的实例投射到VirtualBase
,然后任何人都可以访问公共成员。简单地说
Concrete *obj = new Concrete;
obj->vmethod(); // error, vmethod is private
VirtualBase *obj = VirtualBase::global;
obj->vmethod(); // OK, even if "obj" is really an instance of Concrete
问题是为什么基类只有纯虚方法很重要
这两件事几乎毫无关联。Private意味着它是类的实现细节,而不是公共接口的一部分,但是您可能希望将接口作为实现细节来实现。考虑编写一个类,并决定通过一个需要实现接口的库来实现该功能。这是一个实现细节,没有必要仅仅因为接口只有纯虚拟函数就公开继承。我不是说“不”。见我的答案。:)“面向对象方面”这是什么?@curiousguy,=>OO术语/哲学。如果我看到纯虚拟函数的使用只是为了强制实现方法,我会抱怨。MyVector
和MyString
是否共享一个接口(Container
?)。如果他们不这样做,那么就没有必要创建一个假接口,而且当它不打算以多态方式使用时,将size()
作为一个虚拟函数就更没有意义了。我想我永远不会得到这个问题的答案,但是@匿名投票人,想解释一下吗?
Concrete *obj = new Concrete;
obj->vmethod(); // error, vmethod is private
VirtualBase *obj = VirtualBase::global;
obj->vmethod(); // OK, even if "obj" is really an instance of Concrete