Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从两个抽象类继承_C++ - Fatal编程技术网

C++ 从两个抽象类继承

C++ 从两个抽象类继承,c++,C++,我有一个问题,我还没有测试/编译,想知道这是否可能,是否是糟糕的设计 我的问题是: 我想要一个抽象基类A和一个抽象派生类B 我意识到如果这是可能的,我将在每个类中有许多纯虚拟成员函数,并且我将无法初始化这些对象,但这是抽象类的一个给定值 在我的设计中,我将有另一个派生类C,然后我将初始化它-类C将派生自类B 我会有这样的东西 class C ^ | abstract class B ^ | abstract base class A 我的问题: 首先,这可能吗?我怀疑是这样,但

我有一个问题,我还没有测试/编译,想知道这是否可能,是否是糟糕的设计

我的问题是:

我想要一个抽象基类A和一个抽象派生类B

我意识到如果这是可能的,我将在每个类中有许多纯虚拟成员函数,并且我将无法初始化这些对象,但这是抽象类的一个给定值

在我的设计中,我将有另一个派生类C,然后我将初始化它-类C将派生自类B

我会有这样的东西

class C
  ^
  |
abstract class B
  ^
  |
abstract base class A
我的问题:

首先,这可能吗?我怀疑是这样,但不在类B中声明A中的纯虚函数可能会很麻烦

e、 十,

上面的可以吗


这是不是坏的C++设计?将来,我将从A派生类,所以有这样的设计会很好。

没有问题,它肯定会工作。下面是一个例子

stefanos-imac:dftb borini$ more test.cpp 
#include <iostream>
class A {
public:
    A(void) { std::cout << "A" << std::endl; } 

    virtual void method1() = 0;
};

class B : public A {
public:
    B(void) : A() { std::cout << "B" << std::endl; }

    virtual void method2() = 0;
};

class C : public B {
public:
    C(void) : B() { std::cout << "C" << std::endl; }

    virtual void method1() { std::cout << "method1" << std::endl; }
    virtual void method2() {std::cout << "method2" << std::endl; }
};

int main() {
    C c;
    c.method1();
    c.method2();
}
stefanos-imac:dftb borini$ ./a.out 
A
B
C
method1
method2
stefanos imac:dftborini$more test.cpp
#包括
甲级{
公众:

(void){std::cout关于“可能吗?”的问题:您在等待什么来尝试编译它?关于“它是糟糕的设计吗?”问题:我们不知道你所设计的东西是怎么回事。是的,很好。为什么这是一个糟糕的设计?比如动物,它的后裔哺乳动物都是抽象的,但是是进一步具体课程的好基础。我还没有写完它。-D加上我想考虑我是否正在做抽象类D。esign。你可以编写一个小原型(我想我可以用不到20行的篇幅)来测试你不确定的部分,而不是编写整个shebang。这正是我想看到的——下次我会在提问之前亲自测试它!干杯Stefano!@MWright:通常我们会对“没有研究成果”的问题投反对票,但由于您是该站点的新用户,因此我们没有对您进行访问。
stefanos-imac:dftb borini$ more test.cpp 
#include <iostream>
class A {
public:
    A(void) { std::cout << "A" << std::endl; } 

    virtual void method1() = 0;
};

class B : public A {
public:
    B(void) : A() { std::cout << "B" << std::endl; }

    virtual void method2() = 0;
};

class C : public B {
public:
    C(void) : B() { std::cout << "C" << std::endl; }

    virtual void method1() { std::cout << "method1" << std::endl; }
    virtual void method2() {std::cout << "method2" << std::endl; }
};

int main() {
    C c;
    c.method1();
    c.method2();
}
stefanos-imac:dftb borini$ ./a.out 
A
B
C
method1
method2