如何在c ++中重载类定义之外的构造函数

时间:2011-03-17 05:57:42

标签: c++

好吧,所以我一直在做一个家庭作业项目,找到了一种让我完成作业并让它上交的方法,但它仍然困扰着我。

我有一个动态分配其他类的基类,以及一个Derived类。


//header
class Base 
{
Private:
   Type *type_ptr;
Public:
   Base();
   Base(Type &new_type);
   //getters and setters
}

class Derived : public Base
{
Private:
  Type2 *type2_ptr;
Public:
 Derived();
 Derived(Type, Type2) : Base(Type);

}
 

我想知道的是我的.cpp文件应该是什么样子,而不是像这样在线进行,

Derived(Type new_type, Type2 new_type2): Base(new_type){
  type2_ptr = new Type2(new_type2);
};

编辑:如果我在我的.cpp中尝试类似上面的内容,我会得到这样的错误,总是其中两个......

undefined reference to `vtable for Derived'
undefined reference to `vtable for Derived'

3 个答案:

答案 0 :(得分:2)

头:

/* Base same as yours */

class Derived : public Base
{
Private:
  Type2 *type2_ptr;
Public:
 Derived();
 Derived(Type&, Type2);
}

CPP:

Base::Base(): type_ptr(NULL)
{
// implementation goes here
}
Base::Base(Type &new_type): type_ptr(&new_type)
{
// implementation goes here
}


Derived::Derived()
{
// implementation goes here
}

Derived::Derived(Type& new_type, Type2 new_type2): Base(new_type), 
  type2_ptr(new Type2(new_type2))
{
// implementation goes here
}

注意new_type是引用,而不是Derived中的局部变量,因此传递给Derived的变量必须在适当的范围内!

答案 1 :(得分:1)

在课外,您需要对所有构造函数和函数使用Derived::

Derived::Derived(Type new_type, Type2 new_type2): Base(new_type)
{//^^^^^^^^^ note this  
  type2_ptr = new Type2(new_type2);
};

同时考虑尽可能多地使用initialization-list。这是一个例子!

Derived::Derived(Type new_type, Type2 new_type2): Base(new_type), type2_ptr(new Type2(new_type2))
                                                                //^^^^ note this!
{

};

答案 2 :(得分:0)

你没有展示一切。在你展示的代码中,那里 应该没有vtable,因为没有虚函数(和 无论继承如何,该类都不是多态的。

假设有虚拟功能,你应该差不多 当然要为Base添加一个虚拟析构函数。

除此之外,.cpp文件中的定义应为:

Derived::Derived(Type new_type, Type2 new_type2)
    : Base(new_type)
    , type2_ptr(new Type2(new_type2))
{
}

在你的定义前加上Derived ::就可以了 您公开的代码中没有任何内容会导致问题。您 真的应该提供一个完整的代码示例 导致问题;否则,我们可以猜测。