模板基类
⑴ 类模板的类模板的派生
可以从类模板派生出新的类,既可以派生类模板,也可以派生回非模板类。派生方法答:
⑴ 从类模板派生类模板可以从类模板派生出新的类模板,它的派生格式如下例所示:
template <class T>
class base
{
……
};
template <class T>
class derive:public base<T>
{
……
};
与一般的类派生定义相似,只是在指出它的基类时要缀上模板参数,即base<T>。
⑵ 从类模板派生非模板类 可以从类模板派生出非模板类,在派生中,作为非模板类的基类,必须是类模板实例化后的模板类,并且在定义派生类前不需要模板声明语句:template<class>。例如:
template <class T>
class base
{
……
};
class derive:public base<int>
{
……
};
在定义derive类时,base已实例化成了int型的模板类。
⑵ 模板类子类该怎么实例化为什么这么写报非法基类
所谓“实例化子类的对抄象前要先实例化父类中的内容,为父类初始化”,是指当子类正在实例化时,总是链式调用父类构造方法初始化父类空间。
换句话说,子类的构造方法必须先调用父类的构造方法,完了才能干别的初始化工作。
如果子类没有显式调用语句,编译器会隐式帮你加上。
⑶ C++中的模块包括什么类模版可以从普通类派生,为什么普通基类不能派生类模版
错别字真多。来。。
C++中模板源包括类模板和函数模板
普通基类也可以派生模板类的
根据建立对象的实际数据类型,编译器把类模板实例化为模板类
并不能从构造函数的参数列表推断模板实例化参数类型。类模板的参数类型并不一定会体现在构造函数的参数列表中的,比如构造函数参数列表是void
⑷ c++里面抽象 类 模板各有啥关系呀
抽象:提取事物的来公共部分,忽自略各自特别的地方,即“求同存异”。
类是对象的抽象,模板是类的抽象(当然不全是),这些是C++提供的OOP手段。
最终达到的目的是代码充分复用,以便于维护。
“抽象”不专属于C++,要知道OOP先于C++诞生!
⑸ C++模板类的继承
类模板可以继承也可以被继承。
1.在一个类模板中,一个非依赖型基类是指:无须知道模板实参就可以完全确定类型的
基类。
例如:
template<typename X>
class Base{
public:
int basefield;
typedef int T;
};
class D1:public Base<Base<void> >{//实际上不是模板
public:
void f(){basefield = 3; }
};
template<typename T>
class D2:public Base<double>{
public:
void f() { basefield = 7; }//正常访问继承成员
T strange;//T是Base<double>::T,而不是模板参数
};
注意事项:对于模板中的非依赖类型而言,如果在他的派生类中查找一个非受限名称,
那就会先查找这个非依赖型基类,然后才会查找模板参数列表。
2.非依赖性名称不会在依赖基类中查找
template<typename X>
class Base{
public:
int basefield;
typedef int T;
};
template <typename T>
class DD:Base<T>{
public:
void f(){
basefield = 0;//problem
}
};
template<>
class Base<bool>{
public:
enum { basefield = 42 };//tricky
};
void g(DD<bool>& d){
d.f();//opps
}
//修改方案一
template <typename T>
class DD1:Base<T>{
public:
void f(){
this->basefield=0;//查找被延迟了
}
};
//修改方案二
template <typename T>
class DD2:Base<T>{
public:
void f(){
Base<T>::basefield=0;//查找被延迟了
}
};
如果使用修改方案二,如果原来的非受限非依赖型名称是被用于虚函数调用的话,
那么引入依赖性的限定的话,那么这种引入依赖性的限定将会近之虚函数调用,
从而也会改变程序的含义,当遇到第二种情况不适合的情况,可以采用方案一
⑹ 声明 类模板类的格式是什么
c++:
class 类名 : [访问控制符] 基类名 {
public:
//公有成员声明
protected:
//保护成员声明
private:
//私有成员申明
};
⑺ 关于静态模板类实现多态,请仔细讲解,给高分,谢谢
在调用参数的某个方法的中,如Fun(type a)
如果这个参数(a)的类型是基类,那么调用a的方法就是常见的面向回对象的多态。答a.fun1.
如果Fun(type a)变为一个模板方法,并且参数类型是T
templete<typename T>
Fun(T a)
那么a.fun1 这个时候就会在编译期根据T的类型,调用相应的方法,来实现多态。
⑻ 模板怎样实现继承,基类模板指针要实现指向派生类,需要哪些代码,求给个实例
因为继承描述了 “ 是一种 ” 关系, 所以如果B类继承A类,那么B类对象就是A类对象,专所以A类指针属或者引用就可以指向派生类的对象。比如 Triangle类(三角形类)继承Shape类(形状类),那么定义一个Triangle对象,这对象既是Triangle(三角形)也是Shade(形状)。这种“是一种”关系在面向对象语言中都是适用,不只是C++。如果基类指针指向派生类对象,那么该指针和派生类对象的指针相等吗?不一定相等,派生类指针转换为基类指针时可能需要进行一定的转换(自动进行),所以不一定相等。
⑼ 基类模板的protected成员不能继承类模板的继承问题怎么处理
继承类确实是无法直接访问基类的受保护的成员的,但是你可以通过调用基类的public 函数去获取基类受保护的成员变量的值
⑽ C++中普通的基类能否派生类模板
没试过,但是最好不要这样做,因为派生类对象中含有基类的一部分,所以如果派生类定义为模板而基类是指定类型则会带来很多不变