(8)虚函数测试

#include <iostream>

using namespace std;


void TestVirtualFunction();

void TestVirtualClass();

void TestDrivedClass();

void TestDefaultParam();

/*
	1.如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数
	2.如果调用虚函数,则直到运行时才能确定调用哪个函数,
	运行的虚函数是引用所绑定的或指针所指向的对象所属类型定义的版本。
	3.当程序中函数是非虚函数调用时,B类对象对函数p()的调用时在编译时就已静态确定

	4.虚函数是动态绑定,而缺省参数是静态绑定的
*/
class A
{
public:
	virtual void p()
	{
		cout << "A" << endl;
	}
};

class B : public A
{
public:
	virtual void p()
	{
		cout << "B" << endl;
	}
};

class Base
{
private: 
	virtual void p()
	{
		cout << "Base::p()" << endl;
	}
};

class Drived : public Base
{
};

class BD 
{ 
public: 
	virtual void fun(int i = 1) 
	{ 
		std::cout << "base fun called, " << i; 
	}; 
}; 
class D : public BD 
{ 
private: 
	virtual void fun(int i = 2) 
	{ 
		std::cout << "driver fun called, " << i; 
	}; 
};

#include <iomanip>

#include "8_VirtualFunction.h"


void TestVirtualFunction()
{
	//TestVirtualClass();
	//TestDrivedClass();

	TestDefaultParam();
}

void TestVirtualClass()
{
	A *pA = new A();
	A *pB = new B();
	pA->p();
	pB->p();

	delete pA;
	delete pB;
}

void TestDrivedClass()
{
	typedef void (*Fun)(void);
	Drived d;
	Fun pFun = (Fun)*(((int *)(&d)) + 0);
	cout << hex << setw(8) << &d << endl;
	// 对象地址
	cout << hex << setw(8) << (int *)(&d) << endl;
	// 对象的前四个字节的值(虚函数表的地址)
	cout << hex << setw(8) << *(int *)(&d) << endl;
	// 虚函数表第一项的地址
	cout << hex << setw(8) << (int *)*(int *)(&d) << endl;
	// 虚函数表第一项的地址
	cout << hex << setw(8) << (int *)*(int *)(&d) + 0 << endl;
	// 虚函数表第一项的内容
	cout << hex << setw(8) << *((int *)*(int *)(&d) + 0) << endl;
	cout << hex << setw(8) << (Fun)*((int *)*(int *)(&d) + 0) << endl;

	Fun pFun2 = (Fun)*((int*)*(int*)(&d)+0);
	pFun2();
}

void TestDefaultParam()
{
	BD *pD = new D();
	pD->fun();

	delete pD;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++的代码实现: ```c++ #include <iostream> using namespace std; const double PI = 3.14159; class CPoint { protected: double x; double y; public: CPoint(double x, double y) : x(x), y(y) {} CPoint(const CPoint& p) : x(p.x), y(p.y) {} virtual double GetArea() { return 0; } virtual double GetVolume() { return 0; } virtual void print() { cout << "Point: (" << x << ", " << y << ")" << endl; } }; class CCircle : public CPoint { protected: double radius; public: CCircle(double x, double y, double r) : CPoint(x, y), radius(r) {} CCircle(const CCircle& c) : CPoint(c), radius(c.radius) {} double GetArea() { return PI * radius * radius; } virtual double GetVolume() { return 0; } virtual void print() { cout << "Circle: (" << x << ", " << y << "), radius = " << radius << endl; } }; class CCylinder : public CCircle { protected: double height; public: CCylinder(double x, double y, double r, double h) : CCircle(x, y, r), height(h) {} CCylinder(const CCylinder& c) : CCircle(c), height(c.height) {} double GetArea() { return 2 * PI * radius * height + 2 * PI * radius * radius; } double GetVolume() { return PI * radius * radius * height; } void print() { cout << "Cylinder: (" << x << ", " << y << "), radius = " << radius << ", height = " << height << endl; } }; int main() { CPoint* p1 = new CPoint(1, 2); p1->print(); cout << "Area: " << p1->GetArea() << endl; cout << "Volume: " << p1->GetVolume() << endl; delete p1; CCircle* c1 = new CCircle(3, 4, 5); c1->print(); cout << "Area: " << c1->GetArea() << endl; cout << "Volume: " << c1->GetVolume() << endl; delete c1; CCylinder* cy1 = new CCylinder(6, 7, 8, 9); cy1->print(); cout << "Area: " << cy1->GetArea() << endl; cout << "Volume: " << cy1->GetVolume() << endl; delete cy1; return 0; } ``` 输出结果: ``` Point: (1, 2) Area: 0 Volume: 0 Circle: (3, 4), radius = 5 Area: 78.5398 Volume: 0 Cylinder: (6, 7), radius = 8, height = 9 Area: 703.716 Volume: 1809.56 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值