zds212 发表于 2021-5-7 22:22

cpp 1.菱形继承的处理 虚函数virtual关键字的使用---2.类的多态

本帖最后由 zds212 于 2021-5-7 22:31 编辑

#include<iostream>
using namespace std;

class dongwu
{
public:
         void js()
      {
                cout << "动物叫声" << endl;
      }
         int a;
};
class xiong:virtual public dongwu
{
public:
      void js()
      {
                cout << "熊叫声" << endl;
      }
};
class mao:virtual public dongwu
{
public:
      void js()
      {
                cout << "猫叫声" << endl;
      }
};
class xiongmao :public xiong, public mao
{
public:
      void js()
      {
                cout << "熊猫叫声" << endl;
      }
};

void test()
{
      xiongmao xm;
      //xm.a = 10;//"xiongmao::a"不明确
      xm.a = 10;//派生类xiong和mao类加上继承基类的虚函数关键字virtual就可以实现
      cout << xm.a << endl;
}
int main()
{
      test();
      system("pause");
      return 0;
}








上面是菱形类的处理
----------------------------------------------------------------------



下面是类的多态。


#include<iostream>
using namespace std;

class dw
{
public:
      virtual void a()
      {
                cout << "我是动物" << endl;
      }
};
class yang:public dw
{
public:
         void a()
      {
                cout << "我是羊" << endl;
      }
};
class tuo
{
public:
         void a()
      {
                cout << "我是驼" << endl;
      }
};

class caonima:public yang,public tuo
{
public:
         void a()
      {
                cout << "我是草泥马" << endl;
      }
};

void test01(dw &dwv)//dw &dwv =cnm;
{
      dwv.a();//因为动物类a函数加了虚函数关键字virtual所以这里输出是结果是草泥马。没有的话会是动物类
}

void test02()
{
      caonima cnm;
      test01(cnm);
}
int main()
{
      test02();
      system("pause");
      return 0;
}

hqt 发表于 2021-5-7 22:26

#include<iostream>
using namespace std;

class dongwu
{
public:
         void js()
      {
                cout << "动物叫声" << endl;
      }
         int a;
};
class xiong:virtual public dongwu
{
public:
      void js()
      {
                cout << "熊叫声" << endl;
      }
};
class mao:virtual public dongwu
{
public:
      void js()
      {
                cout << "猫叫声" << endl;
      }
};
class xiongmao :public xiong, public mao
{
public:
      void js()
      {
                cout << "熊猫叫声" << endl;
      }
};

void test()
{
      xiongmao xm;
      //xm.a = 10;//"xiongmao::a"不明确
      xm.a = 10;//派生类xiong和mao类加上继承基类的虚函数关键字virtual就可以实现
      cout << xm.a << endl;
}
int main()
{
      test();
      system("pause");
      return 0;
}




zds212 发表于 2021-5-7 22:26

hqt 发表于 2021-5-7 22:26
#include
using namespace std;



怎么调出这个代码界面 ,大佬!

hqt 发表于 2021-5-7 22:27

本帖最后由 hqt 于 2021-5-7 22:28 编辑

大佬用一下编辑器的 <>
这个样子的东西来加代码
你这样很乱 总编辑器的代码功能就像二楼那个样子一样
@zds212

hqt 发表于 2021-5-7 22:28

大佬用一下编辑器的 <>
这个样子的东西来加代码
你这样很乱 总编辑器的代码功能就像二楼那个样子一样
编辑按钮按一下 改一下

zds212 发表于 2021-5-7 22:30

hqt 发表于 2021-5-7 22:28
大佬用一下编辑器的
这个样子的东西来加代码
你这样很乱 总编辑器的代码功能就像二楼那个样子一样


好的。我了解了。 感谢大佬。

zds212 发表于 2021-5-9 11:33

纯虚函数和纯析构

#include<iostream>
using namespace std;

class animal
{
public:
        animal()
        {
                cout<<"animal构造调用"<<endl;
        }
        virtual void speak() = 0;

        //析构函数加上virtual关键字,变成虚析构函数
        //virtual ~animal()
        //{
        //            cout<<"animal析构调用"<<endl;
    //}
        virtual ~animal() = 0;//纯虚析构声明
};
animal:: ~animal() //纯虚析构类外实现
{
        cout << "类外animal纯虚析构函数调用" << endl;
}
class dog:public animal
{
public:
        dog(string name)
        {
                cout<<"dog构造调用"<<endl;
                m_name = new string(name);//开辟栈的空间
        }
        virtual void speak()
        {
                cout<<"小狗"<<*m_name<<"在汪汪叫"<<endl;
        }
        ~dog()
        {
                cout << "dog析构函数" << endl;
                if (this->m_name != NULL)
                {
                        delete m_name;
                        m_name = NULL;
                }
        }
        string* m_name;
};
void test()
{
        animal *ani = new dog("旺财");
        ani->speak();
        delete ani;
        //通过基类指针去释放,会导致派生类对象清理不干净,造成内存泄漏
        //解决办法-》给基类加一个虚构造函数   virtual上面代码是增加了的
        //虚析构函数就是用来解决通过基类指针释放派生类对象
}
int main()
{
        test();
        system("pause");
        return 0;
}
//虚析构或纯析构就是用来解决通过基类指针释放派生类对象
//如果基类中没有堆区数据,可以不写virtual虚函数、虚析构
//用有纯析构的类也算是抽象类,不能在内外直接实现 ,就是不能直接在外面使用。
页: [1]
查看完整版本: cpp 1.菱形继承的处理 虚函数virtual关键字的使用---2.类的多态