基类与派生类访问(模板与非模板)

若基类只存在含参数的构造函数,在派生类定义构造函数时,必须以成员列表的形式为基类初始化;

若基类有默认构造函数,或不含参数的构造函数,则不必在成员列表中为基类初始化。

 

class A
{
public:
   A(int  data1,int data2):a(data1),b(data2){}
    int get(){ return a; }
};
//B.h  派生类
#include 
#include "A.h"
template 
class B:public A
{
public:
    B(T data1,T data2,T data3):A(data1,data2){c=data3;}  //基类只存在含参数的构造函数,故在派生类构造函数的成员列表中为基类初始化
    void print();
};

 

 

 

class A
{
public:
   A(){};//或者没有A(){}
 int get(){ return a; }
};
//B.h  派生类
#include 
#include "A.h"
template 
class B:public A
{
public:
    B(T data3){c=data3;}  //基类存在含参数的构造函数,在派生类构造函数的成员列表中不需要为基类初始化
    void print();
};


 

 

 

 

 

 

 

1.非模板情况下

 派生类成员函数可以直接访问基类的protected、public成员(包括成员变量,成员函数),但若要访问基类中的private成员,则要通过基类中方式去访问,如基类中的构造函数,pubilc成员函数。

 

 

//A.h  基类
class A
{
private:
    int a;
protected:
    int b;
public:
    A(int  data1,int data2):a(data1),b(data2){}
    int get(){ return a; }
};

 

//B.h  派生类
#include 
#include "A.h"

class B:public A
{
private:
    int c;
public:
    B(int data1,int data2,int data3):A(data1,data2){c=data3;}   //基类初始化
    void print();
};

void B::print()
{
    using std::cout;
    using std::endl;
    cout<
//main.cpp

#include 
#include "B.h"
using namespace std;

int main()
{
    B b(1,2,3);
    b.print();
    return 0;
}

 


2.含模板情况下

 

 

带模板时,派生类访问基类成员时,原则不变,但访问前必须加类名和模板参数 (作用域限定)

 

//A.h   基类  
template 
class A
{
private:
    T a;
protected:
    T b;
public:
    A(T data1,T data2):a(data1),b(data2){}
    T get(){ return a; }
};
//B.h  派生类
#include 
#include "A.h"
template 
class B:public A
{
private:
    T c;
public:
    B(T data1,T data2,T data3):A(data1,data2){c=data3;}
    void print();
};
template 
void B::print()
{
    using std::cout;
    using std::endl;
    cout<<A::get()<A::b<
//main.cpp 
#include 
#include "B.h"
using namespace std;

int main()
{
    B b(1,2,3);
    b.print();
    return 0;
}

 

 

 

 

 

 

 

 

你可能感兴趣的:(C)