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