c++中虚拟继承的对象布局
如何解释下面的结果?
环境是2008年的
#include <iostream>
using namespace std;
class A {
public:
virtual ~A();
virtual void foo();
};
class B : public virtual A {
public:
virtual ~B();
virtual void foo();
};
class C : public virtual A {
继承的顺序是什么?下面的代码意味着什么?
class A
{
int a;
virtual void display()
{
cout<<"A";
}
}
class B
{
int b;
virtual void displayB()
{
cout<<"B";
}
}
class C:public B, virtual public B
{
}
我有多个虚拟基类,它们为实现类创建接口。但是,我希望它们都能够序列化和反序列化自己。这将导致以下ABC继承:
假设我有类A,它允许类的序列化和反序列化。
class A{
virtual void serialize() = 0;
virtual void deserialize() = 0;
}
我有一个B类,它添加了一些虚拟调用,但也必须能够处理它自己的序列化操作:
class B : public A {
B() : A() {
some_variable_B_is_responisble_for = 0;
}
// inherited from A
v
我正在读一篇关于继承的文章,我有一个几个小时都没能解决的大问题:
给定一个类Bar是一个具有virtual函数的类,
class Bar
{
virtual void Cook();
};
它们之间有什么不同:
class Foo : public Bar
{
virtual void Cook();
};
和
class Foo : public virtual Bar
{
virtual void Cook();
};
?我花了几个小时在谷歌上搜索和阅读,得到了很多关于它用途的信息,但没有一个能真正告诉我这两者之间的区别,这只会让我更困惑。
我有一个关于虚拟基类的问题。为了解决多重继承中“可怕的死亡钻石”的/ambiguity问题,引入了虚拟基类。
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
如果在class C声明中不使用关键字virtual,会发生什么情况。你能给我详细解释一下吗?
class A { public: void Foo() {} };
class B : public virtual A {};
c
以下代码是否仍然会因缺乏虚拟继承而受到负面影响?
如果是这样的话,如果class A 包含了数据成员,那么负面影响是否与没有虚拟继承的多重继承的负面影响相同(或同样糟糕)?
class A
{
public :
virtual ~A ( ) { }
virtual int foo ( ) const = 0 ;
} ;
class B : public A
{
public :
virtual ~B ( ) { }
} ;
class C : public A
{
public :
virtual ~C ( ) { }
} ;
class D : publ
我很肯定答案是否定的,但既然会很可爱,我还是会问这个问题的。
示例:
class Serializable
{
public:
virtual void serialize() = 0;
};
class Unserializable
{
public:
virtual void unserialize() = 0;
};
class A : public Serializable
{
public:
virtual void serialize()
{
}
};
class B : public A, public Unserializable
{
publi
代码示例:
class TestOne : public QWidget // To fix this i need to modify class QWidget : public virtual QObject{}; which belongs to qt
{
// ...
};
class TestTwo : public virtual QObject
{
// ...
};
class Test : public TestOne, public TestTwo
{
// ...
};
解决这个问题的其他方法是什么?
我正在尝试正确地设置我的类,并学习如何正确地使用继承。使用MVC5、实体框架和身份模型来实现这一点。我有两个用户,我想从不同的页面注册(商家和追随者)。我想继承ApplicationUser,但对继承的工作原理感到困惑,因为ApplicationUser继承自IdentityUser。
我希望能够访问IdentityUser中的电子邮件和userName字段进行注册。那么,在创建Merchant和Follower类时,我是继承AppUser还是IdentityUser?
应用程序用户类:
namespace IdentitySample.Models
{
public class Ap
假设我在C++中有以下类层次结构:
class AbstractBaseClass
{
public:
// Note: Class is completely abstract! No data!
AbstractBaseClass() {}
virtual ~AbstractBaseClass() {}
virtual std::string definedInVirtual() = 0;
virtual std::string definedInDerived() = 0;
};
class Virtual : public virtual A
class Base
{
public:
Base(std::string arg1, std::string arg2) : arg1(arg1), arg2(arg2) {}
string arg1,arg2;
virtual void f() = 0;
inline virtual ~Base() {}
};
class Mixin1 : virtual public Base
{
};
//Virtual class uses virtual base and a mixin
class VirtualDerived : virtual public
class IA
{
public:
virtual void a() = 0;
};
class A: virtual public IA
{
public:
virtual void a()
{
}
};
class IB: virtual public IA
{
public:
virtual void b() = 0;
};
class B: virtual public IB, public A
{
public:
virtual void b()
{
}
};
您是否总是像我上面那样继承虚拟接口?如果没有,您将如
我有一些关于虚拟对象大小的问题。
1)虚拟函数
class A {
public:
int a;
virtual void v();
}
A类的大小是8bytes....one整数(4字节)加上一个虚拟指针(4字节),这是明确的!
class B: public A{
public:
int b;
virtual void w();
}
B班的尺码是多少?我用尺寸B测试,它打印了12
这是否意味着只有一个vptr,甚至B类和A类都有虚拟函数?为什么只有一个vptr?
class A {
public:
in
我能做这个吗?
class A {
public:
virtual void aFoo() = 0;
};
class B : virtual public A {
public:
virtual void aFoo() { ... }
};
class D : public A {};
class C : public B, virtual public D {};
问题在于aFoo()在B中的实现以及在C中的缺乏。当涉及到编译时,我看到了这个错误:
error: no unique final overrider for ‘virtual void A::aFoo()’ in
为什么这个简单的类层次结构最终出现在抽象类B中?在这个案子里我不知道该怎么找。(也许是钻石问题?)
class I_A
{
virtual void foo() = 0;
};
class I_B : public I_A
{
virtual void bar() = 0;
};
class A : public I_A
{
void foo() override {}
};
class B: public A, public I_B
{
void bar() override {}
};
B b; ///< Compiler says it i
这是在我的c++类中出现的,假设我们有一个带有一些公共函数的基类。
class basevector {
public:
virtual int indexTo(int arg);
virtual int getSize() const;
virtual int push(int);
virtual int pop(int);
}
然后我们就有了一门私人派生的课程
class myvector : private basevector{
public :
virtual int push(int);
virtual int pop(int);
virtual int getSize() c
我想有一个接口IA和另一个扩展它IB。
然后A实现IA,B继承A,也实现IB。
但是,当编译B时出现错误,说明IA内容是未定义的,即使A定义了所有内容:(
class IA
{
public:
virtual ~IA(){}
virtual void foo()=0;
};
class IB : public IA
{
public:
virtual void bar()=0;
};
class A : public IA
{
public:
A();
void foo();
};
class B : public A, public IB
{
pu
我知道虚拟继承的用法:
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
我想知道的是
class X { public: void Bar() {} };
class Y : public virtual X {};
和
class X { public: void Bar() {} };
class Y : public X {};
主要是从实现的角度。我的意思是什么时候我不想使用虚
为了解决钻石问题,我们采用虚拟继承。
class A {}
class B : virtual Public A {}
class C : virtual Public A {}
class D : public B, Public C {}
为什么它不是这样定义的:
class A {}
class B : public A {}
class C : public A {}
class D : virtual public B, virtual public C {}
在C++中有解决菱形问题的现有解决方案而不是第二个解决方案背后的技术原因是什么?改变基类的继承来解决派生类中的一些问题不是很