目录1.什么是虚函数2.纯虚函数3.c++多态4.纯虚函数和ADT过程5.虚析构函数6.dynamic_cast类型转换7.成员函数指针 1.什么是虚函数 C++类中用virtual
C++类中用virtual
修饰的函数叫做虚函数,构造函数没有虚构造函数,存在虚析构函数,C++所有虚函数都是一个指针去存储的,所以具有虚函数的类,内存会增加一个指针大小的内存
#include<iOStream>
#include<string>
using namespace std;
class MM
{
public:
//虚函数指针是同一个,所以无论该类中有多少个虚函数,
//占用的内存就只是一个指针的大小
virtual void print()
{
cout << "我是第一个虚函数" << endl;
}
virtual void printData()
{
cout << "我是第二个虚函数" << endl;
}
protected:
};
class son:public MM
{
public:
void print()
{
//该函数也是虚函数,
//父类中同名函数是虚函数
//所以子类该函数也是虚函数
}
protected:
};
int main()
{
cout << sizeof(MM) << endl;
cout << "...................." << endl;
//虚函数表的理解,下面带图解
MM mm;
long long** p = (long long**)&mm;
using Func = void(*)();
Func f1 = (Func)p[0][0];
Func f2 = (Func)p[0][1];
f1();
f2();
return 0;
}
纯虚函数也是虚函数的一种,只是没有函数体,下面请看怎么表示没有函数体
纯虚函数——>虚函数=0;
具有一个或者多个虚函数的类叫做抽象类
#include<iostream>
using namespace std;
class MM
{
public:
virtual void print() = 0;
};
int main()
{
//MM mm; //抽象类不能构建对象
MM* pmm = nullptr;
return 0;
}
多态指的是因为指针的不同的赋值操作所导致的同一行为的不同结果。多态的这个概念东西不太重要,重要的是什么样的情况调用什么样的行为
virtual
看对象类型virtual
看指针类型final
关键字 禁止子类重写父类方法override
显示说明当前函数是重写函数多态三个必要性条件:
public
继承#include<iostream>
using namespace std;
class MM
{
public:
void print()
{
cout << "父类" << endl;
}
virtual void printData()
{
cout << "MM" << endl;
}
};
class son :public MM
{
public:
void print()
{
cout << "子类" << endl;
}
void printData()
{
cout << "son" << endl;
}
};
int main()
{
MM* pmm = new son;
pmm->print();
pmm->printData();
return 0;
}
ADT:abstract data type
抽象数据类型,主要是通过继承抽象类中,子类必须要实现父类的抽象方法,子类才可以创建对象。
#include<iostream>
#include<string>
using namespace std;
class data
{
public:
string name;
int age;
};
class MM
{
public:
virtual bool empty() = 0;
virtual int size() = 0;
};
class List:public MM
{
public:
bool empty()
{
return 0;
}
int size()
{
return NULL;
}
};
int main()
{
MM* pmm = new List;
pmm->empty();
pmm->size();
}
virtual
修饰的析构函数就是虚析构函数,当存在子类对象初始化父类指针的时候,父类析构函数就要是虚析构函数,否则只会释放父类,存在内存泄漏问题
#include<iostream>
using namespace std;
class MM
{
public:
virtual ~MM()
{
cout << "父类" << endl;
}
};
class son:public MM
{
public:
~son()
{
cout << "子类" << endl;
}
};
int main()
{
MM* pmm = new son;
delete pmm;
return 0;
}
staic_cast
差不多dynamic_cast
更为安全#include<iostream>
using namespace std;
class MM
{
public:
virtual void print() { cout << "MM" << endl; }
};
class son:public MM
{
public:
void print() { cout << "son" << endl; }
};
class A
{
public:
virtual void print(){}
};
class B
{
public:
virtual void print() {}
};
class C:public A,public B
{
public:
void print()
{
cout << "c" << endl;
}
};
int main()
{
MM* partent = new MM;
son* Son = new son;
//上行转换----->没有必要
MM* p = static_cast<MM*>(Son);
MM* pp = dynamic_cast<MM*>(Son);
MM* ppp = Son; //可以
//下行转换
son* x = dynamic_cast<son*>(partent); //安全,父类没有virtual会报错---->多态
if(!x)
{
printf("error");
} //下行转换不安全,不会申请成功
A* a = new A;
B* b = dynamic_cast<B*>(a);
b->print();
return 0;
}
#include<iostream>
#include<functional>
using namespace std;
class MM
{
public:
void print() { cout << "king" << endl; }
static void printData() { cout << "MM" << endl; }
};
int main()
{
void(*p)() = &MM::printData;
p();
//必须通过对象调用
void(MM::*pp)() = &MM::print;
MM mm;
(mm.*pp)();
//函数适配器,让函数调用形态可以适用于别的形态
auto f = bind(&MM::print, &mm);
f();
return 0;
}
到此这篇关于C++虚函数和多态超详细分析的文章就介绍到这了,更多相关C++虚函数和多态内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C++虚函数和多态超详细分析
本文链接: https://www.lsjlt.com/news/178240.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0