吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1320|回复: 6
收起左侧

[C&C++ 转载] cpp 1.菱形继承的处理 虚函数virtual关键字的使用---2.类的多态

[复制链接]
zds212 发表于 2021-5-7 22:22
本帖最后由 zds212 于 2021-5-7 22:31 编辑

[C++] 纯文本查看 复制代码
#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;
}








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



下面是类的多态。


[C++] 纯文本查看 复制代码
#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;
}

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
苏紫方璇 + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hqt 发表于 2021-5-7 22:26
[C++] 纯文本查看 复制代码
#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
[mw_shl_code=cpp,true]#include
using namespace std;

怎么调出这个代码界面 ,大佬!
hqt 发表于 2021-5-7 22:27
本帖最后由 hqt 于 2021-5-7 22:28 编辑

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
苏紫方璇 + 1 + 1 我很赞同!

查看全部评分

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
zds212 + 1 + 1 谢谢@Thanks!

查看全部评分

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

好的。我了解了。 感谢大佬。
 楼主| zds212 发表于 2021-5-9 11:33
纯虚函数和纯析构

[C++] 纯文本查看 复制代码
#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虚函数、虚析构
//用有纯析构的类也算是抽象类,不能在内外直接实现 ,就是不能直接在外面使用。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 09:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表