1. Virtual function
Base class(virtual ), derived class(override)
1)没有使用 virtual 的结果
#include <iostream>
#include <string>
class base
{
public:
std::string GetName() { return "base class"; }
};
class derived :public base
{
public:
std::string GetName() { return "derived class"; }
private:
std::string m_Name;
};
int main()
{
base* Base = new base();
std::cout <<Base->GetName() << std::endl;
std::cout << "--------------------------\n";
derived* Derived = new derived();
std::cout <<Derived->GetName() << std::endl;
std::cout << "--------------------------\n";
base* Poly = Derived;
std::cout << Poly->GetName() << std::endl;
std::cin.get();
return 0;
}
结果:
2)加入virtual 和 override
#include <iostream>
#include <string>
class base
{
public:
virtual std::string GetName() { return "base class"; } //虚函数
};
class derived :public base
{
public:
std::string GetName() override { return "derived class"; }
private:
std::string m_Name;
};
int main()
{
base* Base = new base();
std::cout <<Base->GetName() << std::endl;
std::cout << "--------------------------\n";
derived* Derived = new derived();
std::cout <<Derived->GetName() << std::endl;
std::cout << "--------------------------\n";
base* Poly = Derived;
std::cout << Poly->GetName() << std::endl;
std::cin.get();
return 0;
}
结果:
3. Pure virtual function
It is Claimed in base class without implementation, and enforce the subclass (derived class) to implement
#include <iostream>
#include <string>
class base
{
public:
virtual std::string GetName() = 0; //虚函数
};
class derived :public base
{
public:
std::string GetName() override { return "derived class"; } // 必须定义,否则报错
private:
std::string m_Name;
};
int main()
{
//base* Base = new base(); //不允许生成base实体
//std::cout << "--------------------------\n";
derived* Derived = new derived();
std::cout <<Derived->GetName() << std::endl;
std::cout << "--------------------------\n";
base* Poly = Derived;
std::cout << Poly->GetName() << std::endl;
std::cin.get();
return 0;
}
2. Virtual destructor
1)没有使用virtual destructor代码及其结果:
#include <iostream>
class base
{
public:
base() { std::cout << "base constructor\n"; }
~base() { std::cout << "base destructor\n"; }
};
class derived :public base
{
public:
derived() { m_array = new int[5]; std::cout << "derived constructor\n"; }
~derived() { delete[] m_array; std::cout << "derived destructor\n"; }
private:
int* m_array;
};
int main()
{
base* Base = new base();
delete Base;
std::cout << "--------------------------\n";
derived* Derived = new derived();
delete Derived;
std::cout << "--------------------------\n";
base* Poly = new derived(); //多态
delete Poly;
std::cin.get();
return 0;
}
结果:
此时的 m_array 没有释放掉,存在内存泄漏。
2)让 base class 中的 destructor为虚函数即可
#include <iostream>
#include <functional>
class base
{
public:
base() { std::cout << "base constructor\n"; }
virtual ~base() { std::cout << "base destructor\n"; } //虚析构函数
};
class derived :public base
{
public:
derived() { m_array = new int[5]; std::cout << "derived constructor\n"; }
~derived() { delete[] m_array; std::cout << "derived destructor\n"; }
private:
int* m_array;
};
int main()
{
base* Base = new base();
delete Base;
std::cout << "--------------------------\n";
derived* Derived = new derived();
delete Derived;
std::cout << "--------------------------\n";
base* Poly = new derived(); //多态
delete Poly;
std::cin.get();
return 0;
}