this-> 指针
因为方法是在代码段中,对于所有的对象都只有一份拷贝
所以在对象在方法调用中,隐含的都会传递一个this指针过去,来区别是那个对象调用的方法
析构函数只有一种无参的~A() 在这里面调用对象的delete()方法来释放内存
C++写类的时候class A{}; 后面的大括号要加;
C++中 修饰符这样写,(好像没有类的修饰符)
class A{
public:
int x;
protected:
int y;
private:
int z;
};
#include <iostream.h>
class Animal
{
//C++中只有三种修饰符public protected private
//class 跟struct的区别: class默认是private,struct默认是public
public:
Animal()
{
cout<<"Animal construct"<<endl;
}
Animal(int a){
}
void breathe(){
cout<<"Animal breathe"<<endl;
}
//C++的虚函数:
//不是virtual函数的时候 C++编译器 在编译的时候就绑定了要调用的函数
//是virtual函数的时候 C++编译器 不会绑定要调用的函数,等到运行的时候再决定调用的函数,这种叫做延时绑定
//如果子类有调用子类的函数,如果没有调用父类
virtual void sleep()
{
cout<<"Animal sleep"<<endl;
}
//析构函数在没有子类继承的情况下是任意
//在有子类继承的情况下 只可以是 public 或者 private 因为子类要调用父类的private
protected:
~Animal(){
delete this;
}
};
class Creature {
//C++中的纯虚函数,相当于java中的 abstract函数
//这样的类不能被实例化,继承他的类必须要实现这个方法
public:
virtual void eat()=0;
};
class Fish:public Animal,public Creature
{
public:
const int a;
Fish():Animal(300),a(400) //默认调用父类的带参数构造 然后给个初始值
{
cout<<"Fish construct"<<endl;
}
void breathe()
{
cout<<"Fish breathe"<<endl;
}
void sleep()
{
cout<<"Fish sleep"<<endl;
}
virtual void eat()
{
}
~Fish()
{
}
};
void test_Inherit(Animal *animal)
{
animal->breathe();
animal->sleep();
}
void main()
{
Fish fish;
Animal *animal;
//能不能强制转换,取决于两个类的内存模型是否一样,
//Fish中的内存模型可以分成两个部分:一个是从Animal中继承过来的部分,
//所以强制类型转换后,用调用的都是父类animal的方法
//如果是java的话,会调用子类的方法
animal = &fish;
test_Inherit(animal);
}