最近我作为一名开发人员愚蠢,所以我冒险尝试了一本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.我知道如果删除注释,它将无法编译.请有人可以:
ICommand以及如何使用它们MyCommand 可能重复:
如何在C++中声明接口?
接口如c ++中的java?
我是一名学习C++的Java程序员,我想知道C++中是否存在类似Java接口的东西,即另一个类可以实现/扩展多个类的类.谢谢.ps新来的,告诉我,如果我做错了什么.
昨天,我和我的同事不确定为什么语言禁止这种转换
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类型成员的指针"的prvalueT,其中B是类类型,可以转换为类型为"指向Dcv类型成员的指针"的prvalueT,其中D是派生类(第10条)B.如果B不可访问(第11条),模糊(10.2)或虚拟(10.1)基类D,或虚拟基类的基类D,则需要进行此转换的程序是不正确的.
函数和数据成员指针都会受到影响.
我正在阅读"在C++对象模型中",试图了解如何通过vtable实现多重和虚拟继承.(我完全理解单个多态性).
我很难理解在虚拟继承期间或在转换期间需要定位方法时究竟做了什么,因为要执行大量的偏移计算.
有人能够帮助理解如何在多个或虚拟继承示例中使用多个vtable吗?如果我能理解布局和问题,我可能会更好地理解这个问题.
c++ polymorphism inheritance multiple-inheritance virtual-inheritance
现在,我正在学习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
有没有办法在C++中定义类Foo,以便
即
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) 我有一个基类'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) 我有一个类层次结构,归结为
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++虚拟继承的基础知识.但是,我很困惑我需要在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))?
是否有可能有一些抽象接口的部分实现,然后通过使用多个继承将这些部分实现收集到一个具体的类中?
我有以下示例代码:
#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)