相关疑难解决方法(0)

为什么我应该避免C++中的多重继承?

使用多重继承是一个好主意还是我可以做其他事情?

c++ oop multiple-inheritance

160
推荐指数
6
解决办法
8万
查看次数

谁设计/设计了C ++的IOStreams,并且按照当今的标准,它仍然被认为设计良好吗?

首先,似乎我在征求主观意见,但这并不是我所追求的。我很想听听有关该主题的一些有充分根据的论点。


为了对如何设计现代流/序列化框架有所了解,我最近得到了Angelika Langer和Klaus Kreft撰写的《Standard C ++ IOStreams and Locales》一书的副本。我发现,如果IOStreams的设计不当,那么它就不会首先进入C ++标准库。

在阅读了本书的各个部分之后,我开始怀疑IOStreams是否可以从整体架构的角度与STL进行比较。阅读例如对Alexander Stepanov(STL的“发明人”)的采访,以了解有关STL的一些设计决策。

特别令我惊讶的是

  • 谁来负责IOStreams的总体设计似乎是个未知数(我很想阅读有关此的一些背景信息-有人知道好的资源吗?);

  • 一旦你钻研输入输出流,例如眼前表面之下,如果你想输入输出流用自己的类扩展,你会得到一个接口具有相当神秘和扑朔迷离的成员函数的名称,例如getloc/ imbueuflow/ underflowsnextc/ sbumpc/ sgetc/ sgetnpbase/ pptr/ epptr(和有可能甚至更糟的例子)。这使得了解整体设计以及单个零件如何协作变得更加困难。即使我上面提到的那本书没有帮助多(恕我直言)


因此,我的问题是:

如果你要判断今天的软件工程标准(如果确实对这些任何普遍同意),将C ++的输入输出流仍然被认为是经过精心设计?(我不想通过通常认为过时的方法来提高软件设计技能。)

c++ iostream

125
推荐指数
7
解决办法
1万
查看次数

虚拟继承使用

我需要编写一个将由新手和经验丰富的C++开发人员使用的编码约定.动态多态的继承规则如下:

  • 对于动态多态,请考虑使用单继承(树状层次结构),可能具有抽象接口的多重继承
  • 对于继承层次结构(基类等),默认情况下使用公共继承
  • 对于继承抽象接口,默认情况下使用公共虚拟继承

此规则之后将提供有关实施,可能的例外等的详细信息.

所以,问题是这个规则是否适合新手和经验丰富的C++开发人员?(欢迎/利弊,以及来源和链接是受欢迎的)


我看到的是:

优点:

  • 规则易于新手使用,不限制经验丰富的开发人员.
  • 对那些已经熟悉Java/.NET接口的人来说很熟悉
  • 避免与实现的虚拟继承相关的问题(因为它是为抽象接口保留的),以及非虚拟继承(在转换为接口类时可能存在歧义)

缺点:

  • 轻微的性能成本(转换到接口时的速度,虚拟表的大小,类实例中的附加指针)

注意:我已阅读以下在线资源:

注2:在"C++编码标准"第36项中使用Sutter&Alexandrescu后,使用"抽象接口"名称


这是一个应该工作的情况(它的Java/C#等效使用接口工作),但如果接口继承不是虚拟的,那么在C++中就不会这样:

class A
{
   public :
      virtual ~A() = 0 {}
} ;

class B : public A {} ; // should have been virtual to avoid the error
class C : public A {} ; // should have been virtual to avoid the error

class D : public B, public C
{
   public …
Run Code Online (Sandbox Code Playgroud)

c++ oop inheritance multiple-inheritance

17
推荐指数
1
解决办法
988
查看次数

使用继承的具体类在C++中实现接口

我正在尝试使用抽象类在C++中定义接口类型,并使用具体类来实现它们.我遇到的问题是我不能从另一个接口继承和接口,并从基础具体类继承实现.

我的目标是能够定义可以从不太复杂的基接口继承的接口层次结构.我还希望能够通过继承具体类来扩展接口的实现(比如在下面的例子中继承自TObjectA).

这就是我所拥有的.我得到的错误是"抽象类类型的对象"TObjectB"是不允许的".我相信我知道为什么,这是因为我没有在TObjectB中实现MethodA().但我真的想要的是由基类(TObjectA)提供的实现,并且仍然具有接口层次结构(IInterfaceB继承自IInterfaceA).我也不想在我派生的concreate类中重复所有继承的接口方法.我怎样才能做到这一点?

class IInterfaceA 
{ 
public:
    virtual void MethodA() = 0; 
}; 

class IInterfaceB : IInterfaceA
{ 
public:
    virtual void MethodB() = 0; 
}; 

class TObjectA : public IInterfaceA 
{ 
public:
    void MethodA() { cout << "Method A"; }  
}; 

class TObjectB : public TObjectA, public IInterfaceB 
{ 
public:
    void MethodB() { cout << "Method B"; } 
}; 

void TestInterfaces()
{
    IInterfaceB* b = new TObjectB(); // error: object of abstract class type "TObjectB" is not allowed
    b->MethodB();
    delete …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance multiple-inheritance

10
推荐指数
1
解决办法
7240
查看次数

什么时候虚拟继承是一个好主意?

我正在制作游戏GUI API,其中每个小部件都继承自Widget类.我在想,当其他人制作自己的小部件时,他们可能对基类不满意.例如,他们可能想要添加getTheme().让我的所有小部件实际上都是从Widget继承,那么这是可能的吗?

谢谢

c++

6
推荐指数
1
解决办法
243
查看次数

虚拟继承和接口

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()
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

你是否总是像我一样继承你的界面虚拟?如果没有,您将如何强制执行上述代码?

c++ virtual-inheritance

6
推荐指数
1
解决办法
1986
查看次数

多重继承来解决抽象类

说我有4节课:

class I { public: virtual void X() = 0; };
class A : public virtual I { public: virtual void X() { } };
class B : public I {  };
class C : public A, public B { };
Run Code Online (Sandbox Code Playgroud)

I,B并且C是抽象的,而A不是.如果我只需添加virtual到继承IB,那么A::X()解决I::X()C.

但是,我无法改变其来源B.

我的问题:我能A::X()解决I::XC,而不能改变B?我试过声明AB虚拟C无济于事.我试图没有冗余代码(例如,有C声明X(){A …

c++ multiple-inheritance

6
推荐指数
1
解决办法
2038
查看次数