【问题标题】:Understanding a simple C++ class structure理解一个简单的 C++ 类结构
【发布时间】:2012-11-25 15:30:27
【问题描述】:

我试图理解一些 C++ 代码,发现我的 C++ 有点生疏。除其他外,代码具有以下类结构(为简洁起见,CLASS1CLASS3 未显示):

class CLASS4
  :public CLASS3
  ,public CLASS2{
  public:
    CLASS4(double VARA, double VARB, char VARC, int VARD, double VARE, std::vector<double> VARF, std::string VARG = "")
    throw(Error);
    CLASS4(const CLASS4&);
    ~CLASS4();

    double METHOD1();

  protected:
    void METHOD2();
};

CLASS4::CLASS4(double VARA, double VARB, char VARC, int VARD, double VARE, vector<double> VARF, string VARG) throw(Error)
  :CLASS1(VARC, VARD, VARE, VARF, VARG)
  ,CLASS2(VARB)
  ,CLASS3(VARA, VARC, VARD, VARE, VARF, VARG){}

CLASS4::CLASS4(const CLASS4& VARH)
  :CLASS1(VARH), CLASS2(VARH), CLASS3(VARH){}

CLASS4::~CLASS4(){}

我理解对象的概念和继承的概念。我看到CLASS4 的构造函数和析构函数。我不明白的是继承:public CLASS3, public CLASS2 中的类列表。它的目的是什么?此外,我想知道throw(Error) 应该做什么。另外我想知道第二个构造函数CLASS4(const CLASS4&amp;); 的目的是什么。我知道这对于 C++ 程序员来说将是一个简单的问题。

【问题讨论】:

  • class T : public U, public V 是多重继承。 throw-specifications 已弃用,您不应使用它们。 T(T const&amp;) 是一个复制构造函数。另请参阅The Definitive C++ Book Guide and List
  • 其中不推荐使用的内容(不好的做法?)。我正在查看此代码以查找内存泄漏。会不会有关系?
  • 你能说它到底应该做什么吗?
  • 如果您正在寻找内存泄漏,请确保 destructors of the base-classes are virtual.
  • 它们允许你明确地告诉一个函数可以抛出什么类型的异常。您仍然可以使用noexcept不推荐弃用)来指示函数不会引发任何异常。

标签: c++ class object inheritance throw


【解决方案1】:
class CLASS4
  :public CLASS3
  ,public CLASS2

是多重继承。 多重继承的目的是使您的对象的功能也具有CLASS2CLASS3的功能,它们是从CLASS4创建的(详细解释请阅读此页:http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr134.htm

throw(Error) 应该是在发现错误时抛出错误,听起来可能很蹩脚,但它用于异常处理:)(我建议您阅读此页面以获得清晰的参考:http://msdn.microsoft.com/en-us/library/6dekhbbc(v=vs.80).aspx)

CLASS4(const CLASS4&amp;); 是复制构造函数。 “复制构造函数是 C++ 编程语言中的一种特殊构造函数,用于创建新对象作为现有对象的副本。” (引自维基百科。http://en.wikipedia.org/wiki/Copy_constructor

【讨论】:

    【解决方案2】:

    在基本说明符列表中列出多个类允许一个类从多个其他类继承。这通常称为multiple inheritance

    在函数声明之后放置throw(error) 是函数表达它可能抛出的异常的一种方式。它被称为异常规范。在这种情况下,带有许多参数的CLASS4 构造函数声明它可能会抛出error 异常。这些异常规范现在在 C++11 中已弃用。

    T(const T&amp;) 形式的构造函数称为复制构造函数。它们在以下情况下被调用,当一个对象通过复制另一个对象来创建时:

    T first;
    T second(first);
    

    您的CLASS4 类有一个复制构造函数。期望在使用复制构造函数构造对象后,新对象将是旧对象的副本。

    【讨论】:

      【解决方案3】:
      class CLASS4: public CLASS3, public CLASS2
      

      是说 CLASS4 继承了 CLASS3 CLASS2 的公共方法和属性,并将它们视为自己的公共方法(即它们是 CLASS4 的公共方法)。如果您使用private CLASS3, protected CLASS2,您将采用 CLASS3 的公共方法,并在 CLASS4 中将它们设为私有。同样,在该示例中,CLASS2 的公共方法将受到保护。这在某些情况下很有用:假设您有一个可以序列化到磁盘并以有意义的方式绘制到屏幕上的类。您将继承“Serialisable”和“Renderable”以获得两者的属性。

      CLASS4(const CLASS4&amp; VARH) 构造函数被称为“复制构造函数”。给定一个 CLASS4 的例子,让我成为一个新的 CLASS4,它的属性具有所有相同的值。默认情况下,C++ 为您提供了一个简单的方法,它只依次复制每个属性,因此您通常不需要指定。如果您正在做一些聪明的事情(例如您分配了一大块内存并且您还想复制该内存的内容而不仅仅是指向它的指针),您需要手动指定自己的聪明的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-22
        • 2014-07-31
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        相关资源
        最近更新 更多