创建类模板的子类

时间:2014-07-02 19:05:21

标签: c++ templates inheritance

以下工作代码显示两个给定数字中较小的一个。

#include "stdafx.h"
#include <iostream>
using namespace std;

template <class T>
class Bucky {
public:
  Bucky(T a, T b) {
    first  = a;
    second = b;
  }
  T smaller() {
    return (first<second?first:second);
  }
private:
  T first, second;
};


int main() {
  Bucky <int>obj(69, 105);
  cout << obj.smaller() << endl;
  return 0;
}

我想来自班级&#39; 创建子类,其中成员函数显示& #34;你好!&#34;

请帮忙。

P.S。这是我创建子类的最佳失败尝试:

template <class T>
class mySubclass : public Bucky<T>
{
public:
  mySubclass(T a, T b) {  // error C2512: 'Bucky<T>' : no appropriate default constructor available
    //first  = a;
    //second = b;
  }
  void greet() {
    cout << "Hi there!";
  }
};

5 个答案:

答案 0 :(得分:4)

构造派生类时,它也将构造其基类。如果没有明确指定它,它将尝试使用其默认构造函数(不带参数)构造基类。但是,您的基类没有默认构造函数。相反,您希望委托给Bucky的构造函数,该构造函数需要两个T个参数:

mySubclass(T a, T b)
  : Bucky<T>(a, b) { }

正如您所看到的,这使用了以:开头的奇怪语法,并将构造函数体留空。此语法是成员初始化列表。它说我们通过将Bucky<T>a传递给它的构造函数来初始化b基类。实际上,您还应该将此用于Bucky构造函数:

Bucky(T a, T b)
  : first(a), second(b) { }

我们分别使用firstsecond初始化ab成员。

答案 1 :(得分:3)

mySubclass构造函数未显式初始化基类对象Bucky。因此,编译器将通过调用Bucky的默认构造函数来尝试隐式执行此操作。正如错误所述,Bucky没有默认构造函数。要修复错误,请在构造函数的成员初始化列表中显式初始化Bucky

mySubclass(T a, T b)
: Bucky<T>(a, b)
{}

您还应该使用成员初始值设定项列表来初始化Bucky的数据成员

Bucky(T a, T b) 
: first(a)
, second(b)
{}

答案 2 :(得分:1)

您可以从派生的构造函数中调用基础构造函数:

mySubClass(T a, T b)
    : Bucky(a, b)
{
}

正如错误所述,通过实现构造函数(接受参数的构造函数),您已删除了默认构造函数。当您为子类创建构造函数时,它必须初始化其基类。这样做的方法是在初始化列表中调用基础构造函数,就像上面提到的注释中的人一样。

答案 3 :(得分:1)

正如编译器指出的那样,它无法为您的基类找到合适的默认构造函数。因此,您需要在member initializer list中明确地调用一个。

template <class T>
class mySubclass : public Bucky<T>
{
public:
  mySubclass(T a, T b) : Bucky<T>(a, b) { }
  void greet() {
    cout << "Hi there!";
  }
};

答案 4 :(得分:0)

template <class T>
class a:public Bucky<T> {
public:
  a(T r, T l): Bucky<T>(r, l) {}
  void Hello(void) { std::cout << "Hello there!" << std::endl; }
};

int main() {
  Bucky <int>obj(69, 105);
  a<int> obj2(69, 105);

  obj2.Hello();
  cout << obj.smaller() << endl;
  return 0;
}

我认为这就是你正在寻找的东西。