Наследование и производные классы

Наследование и производные классы

Формат:

класс , производное имя класса: имя базового класса наследует путь, имя базового класса наследования ....

{
член класса
}

Наследовать различные формы:

все члены базового класса будут наследовать наследовать

graph LR
A类-->B
A类-->C
graph LR
A类-->B类
B类-->C类
graph LR
A类-->B类
B类-->C类
A类-->D类
D类-->C类

Там наследование: публичные, защищённые, privated

. Для наследственного класса является базовым классом для всех членов группы (кроме базового класса конструктора и деструктора) наследуются, а только различные права доступа Обычно ил частные члены класса, производный класс не может непосредственно получить доступ к уделу , как это

  • общественности: базовый класс общественности и охраняются в производном классе по-прежнему общественности и privated, но privated базового класса в производном классе не может непосредственно доступ (доступно наследует функцию базового класса из этих частных доступа к членам работать)

  • защищенный: публичный и защищенный базовый класс становится защищенным в производном классе, базовый класс privated непосредственно не доступен в производном классе

  • privated: базовый класс становится privated общественности и охраняется в производном классе, базовый класс privated непосредственно не доступен в производном классе

Производные классы:

в дополнении к унаследованным вещам также присоединились прямые функциями

Тип класса совместимый

Тип класса совместимый

#include
   
   
    
    
using namespace std;

class Base1{ //基类base1定义
public: 
    void display() const{
    cout << "Base1::display()" << endl;
    }
};

class Base2:public Base1{//共有派生类base2定义 
public:
    void display() const{
        cout << "Base2::disply()" << endl; 
    } 
};

class Derived:public Base2{
public:
    void display() const{
        cout << "Derived::display()" << endl;
    }
};

void fun(Base1 *ptr)
{
    ptr->display();
}
int main()
{
    Base1 base1;
    Base2 base2;
    Derived derived;
    fun(&base1);
    fun(&base2);
    fun(&derived);
    return 0;
}

   
   

Результаты:


Походный конструктор класса, функция деструктора и копирование

Конструктор (для типа 1,2UML)

  1. Если вы не написали конструктор использует конструктор по умолчанию
  2. Если писать конструктор по умолчанию с аргументами и не написать конструктор по умолчанию, то при создании производного класса конструктора должно быть отображено на их структуру (я не пишу подробность)
  3. Примечание: По умолчанию конструктор инициализирует список, вы можете инициализировать класс объекта, конструктор по умолчанию базового класса, производных элементов данных класса, но не может быть доверено конструктор производного класса, по заказу конструктора, чтобы быть в одиночку
Конструктор класса

#include
   
   
    
    
using namespace std;

class Base1 {
public:
    Base1(int i) { cout << " Constructing Base1" << endl; }
    Base1() = default;
};

class Base2 {
public:
    Base2(int j) { cout << "Constructing Base2" << endl; }
    Base2() = default;
};

class Base3 {
public:
    Base3() { cout << "Constructing Base3 *" << endl; }
};

class Derived :public Base2, public Base1, public Base3 {
public:
    Derived(int a, int b, int c, int d) :member2(d), member1(c), Base1(a), Base2(b){}
    Derived(int k) :Derived() { w = k, h = k; }
    Derived() = default;
private:
    Base1 member1;
    Base2 member2;
    Base3 memeber3;
    int w, h;
};

int main()
{
    Derived obj(1, 2, 3, 4);
    return 0;
}

   
   

Во-первых, построенная в соответствии с порядком следования инициализации класса, и затем для того, чтобы инициализировать объект по объекту, делегат конструктора фиг линию 24, чтобы отделить

функция копирования

  • Наследственные члены от базового класса, его конструктор копирования должны быть достигнут путем копирования конструктора базового класса
  • Копировать конструктор производного класс отвечает за копирование параметров конструктора базового класса передается
  • Копировать конструктор производного класс может принимать только один параметр, этот параметр не используется только для инициализации производных членов определения класса, он также будет передан в конструктор копирования для базового класса
  • Копировать тип параметра конструктора является ссылкой на базовый класс базового класса, аргумент может быть получена ссылка на объект класса

Destructor

  • Деструктор не наследуется, производный класс, чтобы объявить при желании самостоятельно деструктор
  • метод Destructor того же общего утверждения (без наследования) классов
  • Вызов последовательности деструктор напротив конструктора
    • Первый член объекта деструктора, который сконфигурирован с последовательностью деструктора в обратном порядке
    • Тогда порядок выполнения базового класса деструктора, порядок выполнения противоположен конструктор
    • Выполненный первый производный класс деструктор
Производный класс деструктор

#include
   
   
    
    
using namespace std;
class Base1 {
public:
    Base1(int i)
    {
        cout << "Constructing Base1" << i << endl;
    }
    ~Base1() { cout << "Destructing Base1" << endl; }
};

class Base2 {
public:
    Base2(int j)
    {
        cout << "Constructing Base2" << j << endl;
    }
    ~Base2() { cout << "Destructing Base2 " << endl; }
};

class Base3 {
public:
    Base3() { cout << "Constructing Base3 *" << endl; }
    ~Base3() { cout << "Destructing Base3" << endl; }
};

class Derived :public Base2, public Base1, public Base3 {
public:
    Derived(int a, int b,int c, int d):Base1(a), member2(d), member1(c), Base2(b){}
private:
    Base1 member1;
    Base2 member2;
    Base3 member3;
};

int main()
{
    Derived obj(1, 2, 3, 4);
    return 0;
}


   
   

сфера

  • будут охвачены члены производного класса с тем же именем базового класса (такое же количество параметров типа)
  • Производная член класса базового класса, который имеет такое же имя функции, производный класс не может перейти непосредственно к вызову, будет производить двусмысленность
    • С именем класса определяется c1.A :: f () или c1.B :: f ()
    • Из того же самого названия скрыты, члены одной и той же функции имя снова в производном вызова класса A :: F () или B :: F ()

Виртуальный базовый класс

Для того, чтобы решить эту проблему: Когда производный класс является производной от нескольких базовых классов, которые имеют общие базовый класс базовый класса, то члены доступа к этому общему базовому классу, будет производить избыточность и противоречивость может быть из-за избыточность принести

Виртуальная декларация базового класса:

  • BenQ сказал в наследовании виртуального класса
  • Класс B1: виртуальный общественный B

Роль базового класса виртуальной:

  • В основном используются для решения того же базового класса множественного наследования двусмысленности, вытекающей из проблем, которые могут возникнуть, когда множественное наследование
  • Обеспечивает член уникальной базы класса далека производный класс, а не повторять много раз, чтобы произвести

Примечание :

На первом этапе общий базовый класс унаследует разработан виртуальный базовый класс

наследование Виртуальный базовый класс

#include
   
   
    
    
using namespace std;

class Base0 {
public:
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};

class Base1 :virtual public Base0 {
public:
    int var1;
};

class Base2 :virtual public Base0 {
public:
    int var2;
};

class Derived :public Base1, public Base2 {
public:
    int var;
    void fun() {
        cout << "Member of Derived" << endl;
    }
};

int main()
{
    Derived d;
    d.var0 = 2;
    d.fun0();
    cout << &d.Base1::var0 << endl;
    cout << &d.Base2::var0 << endl;
    return 0;
}

   
   

Конструктор виртуального базового класса

  • При создании объектов указанного класса называется производным классом дальним
  • Члены конструктора виртуального базовый класса является наиболее отдалены от производного класса, вызывая конструктор инициализирует виртуальный базовый класс
  • На протяжении всей иерархии наследования, прямо или косвенно производный класс наследует все базового класса виртуальной, должны быть перечислены в качестве параметра конструктора виртуального базового класса инициализирует список членов конструктора. Если это не так, вызовите конструктор по умолчанию представляет собой базовый класс виртуальный
  • При создании объекта, лишь постольку, поскольку производный класс конструктор вызывает конструктор виртуального базового класса, другие классы называют конструктору виртуального базового класса игнорируется
Конструктор виртуального базового класса

#include
   
   
    
    
using namespace std;

class Base0 {
public:
    Base0(int var):var0(var){}
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};
class Base1 :virtual public Base0 {
public:
    Base1(int var) :Base0(var) {}
    int var1;
};

class Base2 :virtual public Base0 {
public:
    Base2(int var) :Base0(var){}
    int var2;
};

class Derived :public Base1, public Base2 {
public:
    Derived(int var) :Base0(var), Base1(var), Base2(var){}
    int var;
    void fun()
    {
        cout << "Member of Derived" << endl;
    }
};

int main()
{
    Derived d(1);
    d.var0 = 2;
    d.fun0();
    return 0;
}

   
   

рекомендация

отwww.cnblogs.com/Liberavi/p/11668019.html