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;
} #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;
}
hqt 发表于 2021-5-7 22:26
#include
using namespace std;
怎么调出这个代码界面 ,大佬! 本帖最后由 hqt 于 2021-5-7 22:28 编辑
大佬用一下编辑器的 <>
这个样子的东西来加代码
你这样很乱 总编辑器的代码功能就像二楼那个样子一样
@zds212
大佬用一下编辑器的 <>
这个样子的东西来加代码
你这样很乱 总编辑器的代码功能就像二楼那个样子一样
编辑按钮按一下 改一下 hqt 发表于 2021-5-7 22:28
大佬用一下编辑器的
这个样子的东西来加代码
你这样很乱 总编辑器的代码功能就像二楼那个样子一样
好的。我了解了。 感谢大佬。 纯虚函数和纯析构
#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]