C++快速入门---虚方法(16)
new和delete
(new相当于malloc,delete相当于free)
在没有创建变量的情况下为有关数据分配内存。也就是直接创建一个指针并让它指向新分配的内存块。
int *pointer= new int; //用new创建一个int类型的内存,占用四个字节的空间
*pointer = 110;
std::cout << *pointer;
delete pointer;
(因为程序不会自动释放内存,程序中的每一个new操作都必须有一个与之对应的delete操作)
虚方法
声明一个虚方法的语法,只要在其原型前边加上virtual保留字即可。
virtual void play();
cat 和 dog在编译时都是Pet类型指针,编译器就认为两个指针调用的play()方法是Pet::play()方法,因为这是执行起来最快的解决方案。
为了让编译器知道它应该根据这两个指针在运行时的类型而有选择地调用正确的方法(Dog::play()和Cat::play()),我们必须把这些方法声明为虚方法
#include <iostream>
#include <string>
class Pet
{
public:
Pet(std::string theName);
void eat();
void sleep();
virtual void play();
protected:
std::string name;
};
class Cat : public Pet
{
public:
Cat(std::string theName);
void climb();
void play();
};
class Dog : public Pet
{
public:
Dog(std::string theName);
void bark();
void play();
};
Pet::Pet(std::string theName)
{
name = theName;
}
void Pet::eat()
{
std::cout << name << "正在吃东西!\n";
}
void Pet::sleep()
{
std::cout << name << "正在睡大觉!\n";
}
void Pet::play()
{
std::cout << name << "正在玩儿!\n";
}
Cat::Cat(std::string theName) : Pet(theName)
{
}
void Cat::climb()
{
std::cout << name << "正在爬树!\n";
}
void Cat::play()
{
Pet::play();
std::cout << name << "玩毛线球!\n";
}
Dog::Dog(std::string theName) : Pet(theName)
{
}
void Dog::bark()
{
std::cout << name << "旺~旺~\n";
}
void Dog::play()
{
Pet::play();
std::cout << name << "正在追赶那只该死的猫!\n";
}
int main()
{
Pet *cat = new Cat("加菲");
Pet *dog = new Dog("欧迪");
cat->sleep();
cat->eat();
cat->play();
dog->sleep();
dog->eat();
dog->play();
delete cat;
delete dog;
return 0;
}
#include <iostream>
class animal
{
public:
void sleep()
{
std::cout << "animal sleep" << std::endl;
}
virtual void breathe()
{
std::cout << "animal breathe" << std::endl;
}
};
class fishc : public animal
{
public:
void breathe()
{
std::cout << "fish bubble" << std::endl;
}
};
int main()
{
fishc fh;
animal *pAn = &fh;
pAn -> breathe();
return 0;
}