标签: virtual-inheritance

C++抽象基类构造函数/析构函数 - 一般正确性

最近我作为一名开发人员愚蠢,所以我冒险尝试了一本C++书籍并学习如何正确地做事.在我脑海里,我知道自己想做什么.我有效地想要一个Interface继承的,必须被覆盖(如果这是可能的?).到目前为止,我有以下内容:

class ICommand{

public:
    //  Virtual constructor. Needs to take a name as parameter
    //virtual ICommand(char*) =0;
    //  Virtual destructor, prevents memory leaks by forcing clean up on derived classes?
    //virtual ~ICommand() =0; 
    virtual void CallMe() =0;
    virtual void CallMe2() =0;
};

class MyCommand : public ICommand
{
public:
    // Is this correct?
    MyCommand(char* Name) { /* do stuff */ }
    virtual void CallMe() {}
    virtual void CallMe2() {}
};
Run Code Online (Sandbox Code Playgroud)

我故意离开了我认为应该实现构造函数/析构函数的方式ICommand.我知道如果删除注释,它将无法编译.请有人可以:

  1. 演示如何声明构造函数/析构函数ICommand以及如何使用它们MyCommand
  2. 我是否正确设置, …

c++ inheritance abstract-class virtual-inheritance

16
推荐指数
1
解决办法
4万
查看次数

相当于C++中的Java接口?

可能重复:
如何在C++中声明接口?
接口如c ++中的java?

我是一名学习C++的Java程序员,我想知道C++中是否存在类似Java接口的东西,即另一个类可以实现/扩展多个类的类.谢谢.ps新来的,告诉我,如果我做错了什么.

c++ java abstract-class overriding virtual-inheritance

16
推荐指数
1
解决办法
2万
查看次数

为什么不允许从VirtualBase ::*转换为Derived ::*?

昨天,我和我的同事不确定为什么语言禁止这种转换

struct A { int x; };
struct B : virtual A { };

int A::*p = &A::x;
int B::*pb = p;
Run Code Online (Sandbox Code Playgroud)

甚至演员都没有帮助.如果基本成员指针是虚拟基类,为什么标准不支持将基本成员指针转换为派生成员指针?

相关的C++标准参考:

类型"指向Bcv类型成员的指针"的prvalue T,其中B是类类型,可以转换为类型为"指向Dcv类型成员的指针"的prvalue T,其中D是派生类(第10条)B.如果B不可访问(第11条),模糊(10.2)或虚拟(10.1)基类D,或虚拟基类的基类D,则需要进行此转换的程序是不正确的.

函数和数据成员指针都会受到影响.

c++ virtual-inheritance member-pointers

15
推荐指数
1
解决办法
247
查看次数

多个或虚拟继承下的类的内存布局和vtable?

我正在阅读"在C++对象模型中",试图了解如何通过vtable实现多重和虚拟继承.(我完全理解单个多态性).

我很难理解在虚拟继承期间或在转换期间需要定位方法时究竟做了什么,因为要执行大量的偏移计算.

有人能够帮助理解如何在多个或虚拟继承示例中使用多个vtable吗?如果我能理解布局和问题,我可能会更好地理解这个问题.

c++ polymorphism inheritance multiple-inheritance virtual-inheritance

15
推荐指数
1
解决办法
9056
查看次数

为什么C++ 11中的统一初始化在虚拟基类中表现得很奇怪?

现在,我正在学习C++中的继承功能,并希望测试最近学到的虚拟基类的概念.我尝试了以下简单的代码:

#include <iostream>

using namespace std;

class A
{
private:
    int m_value;
    string m_caller;
public:
    A(int p_value, string p_caller) : m_value{p_value}, m_caller{p_caller}
    {
        cout<<"Instantiating A via "<<m_caller<<endl;
    }
};

class B : virtual public A
{
private:
    int m_value;
public:
    B(int p_value1,int p_value2) : A{p_value1,"B"}, m_value{p_value2}
    {
        cout<<"Instantiating B."<<endl;
    }
};

class C : public B
{
public:
    C(int p_value1,int p_value2) : A{p_value1,"C"}, B(p_value1, p_value2)
    {
        cout<<"Instantiating C."<<endl;
    }
};

int main()
{
    C c1(1,2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意B(p_value1, …

c++ inheritance multiple-inheritance virtual-inheritance c++11

15
推荐指数
1
解决办法
294
查看次数

C++多重继承防止钻石

有没有办法在C++中定义类Foo,以便

  1. 我可以继承它
  2. 我不能从它"钻石继承"

class Cat: public Foo{} // okay
class Dog: public Foo{} // okay
class Weird: public Cat, public Dog {} // I want this to throw a compiler error
Run Code Online (Sandbox Code Playgroud)

c++ inheritance virtual-inheritance diamond-problem

14
推荐指数
1
解决办法
2103
查看次数

Diamond-inheritance场景在G ++中编译很好,但在VC++/Eclipse中产生警告/错误

我有一个基类'Base',这是一个纯虚拟类:

class Base {

public:
    virtual void A() = 0;
    virtual void B() = 0;

    virtual ~Base() { } // Eclipse complains that a class with virtual members must have virtual destructor
};
Run Code Online (Sandbox Code Playgroud)

我还有另外两个类,其中一个实现了A(),另一个实现了B():

class DerivedA : public virtual Base
{
public:
    virtual void A() {
        printf("Hello from A");
    }
};

class DerivedB : public virtual Base
{
public:
    virtual void B() {
        printf("Hello from B");
    }
};
Run Code Online (Sandbox Code Playgroud)

声明中的虚拟关键字应解决钻石问题.

现在我想将这两个类组合成另一个类,以便实现A()和B(),如下所示:

class DerivedC: public DerivedA, public DerivedB {
     // Now DerivedA …
Run Code Online (Sandbox Code Playgroud)

c++ oop class multiple-inheritance virtual-inheritance

14
推荐指数
2
解决办法
1606
查看次数

构造函数继承的虚拟继承

我有一个类层次结构,归结为

class Module { };

struct Port {
    Module& owner;
    Port(Module& owner) : owner(owner) {}
};

struct InPort    : virtual Port    { using Port::Port; };
struct OutPort   : virtual Port    { using Port::Port; };
struct InOutPort : InPort, OutPort { using Port::Port; };
Run Code Online (Sandbox Code Playgroud)

如您所见,我更愿意创建一些基本功能,并以经典的菱形图案继承它.我也想使用构造函数继承使其尽可能地证明未来...

但是,这不起作用如上所述

prog.cpp: In function 'int main()':
prog.cpp:14:15: error: use of deleted function 'InOutPort::InOutPort(Module&)'
  InOutPort p(m);
Run Code Online (Sandbox Code Playgroud)

InOutPort使用更明确的版本替换定义也是不够的:

struct InOutPort : InPort, OutPort { InOutPort(Module& m) : Port(m), InPort(m), OutPort(m) { } }; …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance virtual-inheritance c++11

14
推荐指数
1
解决办法
311
查看次数

复杂多重继承层次结构中"虚拟"关键字在哪里?

我理解C++虚拟继承的基础知识.但是,我很困惑我需要在virtual复杂的类层次结构中使用关键字.例如,假设我有以下类:

            A
           / \
          B   C
         / \ / \
        D   E   F
         \ / \ /
          G   H
           \ /
            I
Run Code Online (Sandbox Code Playgroud)

如果我想确保在任何子类中都没有出现过多次类,那么需要标记哪些基类virtual?他们都是?或者只在那些直接从一个类派生的类上使用它就足够了,否则这个类可能有多个实例(即B,C,D,E和F;以及G和H(但只有基类E,而不是基类D和F))?

c++ multiple-inheritance virtual-inheritance

13
推荐指数
2
解决办法
1924
查看次数

从抽象基类的多个部分实现继承?

是否有可能有一些抽象接口的部分实现,然后通过使用多个继承这些部分实现收集到一个具体的类中

我有以下示例代码:

#include <iostream>

struct Base
{
    virtual void F1() = 0;
    virtual void F2() = 0;
};

struct D1 : Base
{
    void F1() override { std::cout << __func__ << std::endl; }
};

struct D2 : Base
{
    void F2() override { std::cout << __func__ << std::endl; }
};

// collection of the two partial implementations to form the concrete implementation
struct Deriv : D1, D2
{
    using D1::F1; // I …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance virtual-inheritance

13
推荐指数
1
解决办法
1813
查看次数