C++虚函数



因为不会经常用到,看完教程总忘。现在在这儿记录下来,以后看一下这里,就回忆起来,比较方便。上代码:

#include <iostream>
#include <string>

class Pet
{
public:
	Pet(std::string theName);
	void play();

protected:
	std::string name;
};

class Cat : public Pet
{
public:
	Cat(std::string theName);
	void play();
};

class Dog : public Pet
{
public:
	Dog(std::string theName);
	void play();
};

Pet::Pet(std::string theName)
{
	name = theName;
}

void Pet::play()
{
	std::cout << name << "正在玩儿!\n";
}

Cat::Cat(std::string theName) : Pet(theName)
{
}

void Cat::play()
{
	Pet::play();
	std::cout << name << "玩毛线球!\n";
}

Dog::Dog(std::string theName) : Pet(theName)
{
}

void Dog::play()
{
	Pet::play();
	std::cout << name << "正在追赶那只该死的猫!\n";
}

int main()
{
	Pet *cat = new Cat("加菲");
	Pet *dog = new Dog("欧迪");

	cat -> play();

	dog -> play();

	delete cat;
	delete dog;

	return 0;
}

这段代码出自小甲鱼的教程,mian里面用基类指针接收创建的子类对象,此时创建的子类对象被编译器识别的时候,类型还是基类,所以cat->play()和dog->play()调用的是基类的play(),而不是自己子类自己的play()。


运行结果如下:


加菲正在玩儿!
欧迪正在玩儿!


使用虚方法解决一下这个问题、、、


#include <iostream>
#include <string>

class Pet
{
public:
	Pet(std::string theName);

	virtual void play();

protected:
	std::string name;
};

class Cat : public Pet
{
public:
	Cat(std::string theName);

	void play();
};

class Dog : public Pet
{
public:
	Dog(std::string theName);

	void play();
};

Pet::Pet(std::string theName)
{
	name = theName;
}

void Pet::play()
{
	std::cout << name << "正在玩儿!\n";
}

Cat::Cat(std::string theName) : Pet(theName)
{
}

void Cat::play()
{
	Pet::play();
	std::cout << name << "玩毛线球!\n";
}

Dog::Dog(std::string theName) : Pet(theName)
{
}

void Dog::play()
{
	Pet::play();
	std::cout << name << "正在追赶那只该死的猫!\n";
}

int main()
{
	Pet *cat = new Cat("加菲");
	Pet *dog = new Dog("欧迪");

	cat -> play();

	dog -> play();

	delete cat;
	delete dog;

	return 0;
}

这段代码运行的结果就是:


加菲正在玩儿!
加菲玩毛线球!
欧迪正在玩儿!
欧迪正在追赶那只该死的猫!

把基类的play()声明成虚函数,在这种创建对象的情况下,就能执行子类的方法了。



析构器是虚方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值