C++助教篇7_继承的十种常见情况

Posted xioacd99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++助教篇7_继承的十种常见情况相关的知识,希望对你有一定的参考价值。

大家可能也快学到继承了,所以这里总结了一下C++继承的十种常见情况。还有一些情况,如菱形继承等没有提到。

以第一个为例,说明怎样 test 这些例子

普通公有派生

#include <iostream>
using namespace std;

class Base 
public:
    Base(int base_val = 0) : base(base_val) 
    void output() const  cout << base; 

private:
    int base;
;

class Derived : public Base 
public:
    Derived(int base_val = 0, int derived_val = 0)
        : Base(base_val), derived(derived_val) 
    void output() const  cout << derived; 

private:
    int derived;
;

int main(int argc, const char** argv) 
    Base bObj(1);
    Derived dObj(2, 3);
    cout << "The value of base is ";
    bObj.output();
    // cout << bObj.base;
    cout << endl << "the valuse of derived is ";
    dObj.output();
    // cout << dObj.derived;
    dObj.Base::output();
    // cout << dObj.base;
    system("pause");
    return 0;

没有虚析构函数,继承类没有虚构

class Base 
public:
    virtual void output()  cout << "Hello,I'm class Base"; 
    ~Base()  cout << "Oh,goodbye Base"; 
;

class Derived : public Base 
public:
    virtual void output()  cout << "Hello,I'm class Derived"; 
    ~Derived()  cout << "Oh,goodbye Derived"; 
;

纯虚函数,多态

class Base 
public:
    virtual void output() = 0;
;

class Derived : public Base 
public:
    void output()  cout << "Hello,I'm class Derived"; 
;

class AnotherDerived : public Base 
public:
    void output()  cout << "Hello,I'm AnotherDerived"; 
;

多继承

class Base 
public:
    Base(int base_val = 0) : base(base_val) 
    void output()  cout << "Base: " << base; 

private:
    int base;
;

class AnotherBase 
public:
    AnotherBase(int ab_val = 0) : another_base(ab_val) 
    void output()  cout << "AnotherBase: " << another_base; 

private:
    int another_base;
;

class Derived : public Base, public AnotherBase 
public:
    Derived(int base_val, int ab_val, int d_val)
        : Base(base_val), AnotherBase(ab_val), derived(d_val) 
    void output()  cout << "Derived: " << derived; 

private:
    int derived;
;

共同基类的多继承

class Father 
public:
    Father(int fval) : father(fval) 
    void output()  cout << "Father: " << father; 

private:
    int father;
;

class Son : public Father 
public:
    Son(int fval, int sval) : Father(fval), son(sval) 
    void output()  cout << "Son: " << son; 

private:
    int son;
;

class Daughter : public Father 
public:
    Daughter(int fval, int dval) : Father(fval), daughter(dval) 
    void output()  cout << "Daughter: " << daughter; 

private:
    int daughter;
;

class GrandSon : public Son, public Daughter 
public:
    GrandSon(int fval, int sdval, int gval)
        : Son(fval, sdval), Daughter(fval, sdval), grandSon(gval) 
    void output()  cout << "GrandSon: " << grandSon; 

private:
    int grandSon;
;

虚基类

class Base 
public:
    void output()  cout << "Base"; 
;

class SonA : public virtual Base 
public:
    void output() 
        cout << "SonA" << endl;
        Base::output();
    
;

class SonB : public virtual Base 
public:
    void output() 
        cout << "SonB" << endl;
        Base::output();
    
;

class GrandSon : public SonA, public SonB 
public:
    void output() 
        cout << "GrandSon" << endl;
        SonA::output();
        SonB::output();
    
;

私有继承

class Base 
public:
    Base(int publ_val, int prot_val, int priv_val)
        : publ(publ_val), prot(prot_val), priv(priv_val) 
    int getPubl() const  return publ; 

protected:
    int getProt() const  return prot; 

private:
    int getPriv() const  return priv; 

public:
    int publ;

protected:
    int prot;

private:
    int priv;
;

class Derived : private Base 
public:
    Derived(int publ_val, int prot_val, int priv_val)
        : Base(publ_val, prot_val, priv_val) 
    int get_publ() const  return getPubl(); 
    int get_prot() const  return getProt(); 
    int get_priv() const  return getPriv();   // not accessible
;

多级单线继承

多级继承的常见的还有菱形继承,但是不推荐那样设计。

class Tiger 
public:
    Tiger(int age_num) : age(age_num) 
    void roar() const  cout << "Tiger is roaring..."; 

protected:
    int age;
;

class Female_Tiger : public Tiger 
public:
    Female_Tiger(int age_num, string sex_opt) : Tiger(age_num), sex(sex_opt) 
    void roar() const  cout << "Female_Tiger is roaring..."; 

protected: // can be accessed by derived class
    string sex;
;

class Small_Female_Tiger : public Female_Tiger 
public:
    Small_Female_Tiger(int age_num, string sex_opt, string partent_name)
        : Female_Tiger(age_num, sex_opt), partent(partent_name) 
    void roar() const  cout << "Small_Female_Tiger is roaring..."; 

protected:
    string partent;
;

类的兼容性原则

class Base 
public:
    void output()  cout << "Base" << endl; 
;

class Derived : public Base 
public:
    void output()  cout << "Derived" << endl; 
;

void test_function(Base base)  base.output(); 

int main(int argc, const char **argv) 
    // 注意观察下面输出的值,看是否和你的猜测一样
    Derived derived;
    Base base;

    Base *ptrBase = &derived;
    Base &refBase = derived;
    base = derived;

    base.output();
    derived.output();
    ptrBase->output();
    test_function(derived);
    refBase.output();

    system("pause");
    return 0;

虚析构函数,防止内存泄漏

查看Base类加virtual前后创建一个对象析构的输出有什么区别

class Base 
public:
    // ~Base()cout<<"Base Destructor";
    virtual ~Base()cout<<"Base Destructor";
;

class Derived : public Base 
public:
    ~Derived()cout<<"Derived Constructor";
;

以上是关于C++助教篇7_继承的十种常见情况的主要内容,如果未能解决你的问题,请参考以下文章

数据结构——常见的十种排序算法

数据挖掘最常见的十种方法

推荐 :关于机器学习的十种常用算法

Java代码常见的十种错误

Linux 命令行:cURL 的十种常见用法

技术干货 | Docker容器中需要避免的十种常见误区