封装:
隐藏具体的实现,然后提供公开的访问接口,把客观事物的属性封装到一个类内。
继承:
继承就是一种传承,涉及两个类父类(基类)子类(派生类)。
子类传承父类的所有属性,并对父类进行拓展。
举例:要自己实现一个对话框类,可以继承QDailog类再自己拓展编写。
#include <iostream>
using namespace std;
#include <string>
class Animal
{
public:
string name;
int age;
void show()
{
cout << name << ":" << age << endl;
}
};
class Cat :public Animal
{
int legs;
public:
string color;
void fun()
{
cout << "抓老鼠" << color << endl;
}
};
int main()
{
cout << sizeof(Cat) << endl;
Cat cat;
cat.name = "wangcai";
cat.color = "black";
cat.age = 3;
cat.show();
cat.fun();
}
C#C++中若sizeof计算类的大小,只计算成员对象的大小,不计算成员函数的大小
当一个类型中提供了虚函数,则编译器会自动提供一个指针类型的成员来管理这个数据,这个指针交虚表指针。
指针占四个字节,无论类型提供了多少虚函数,只会提供一个虚表指针。
多态:
虚函数:在普通成员函数前加virtual修饰函数
#include<iostream>
using namespace std;
class A
{
int x;
int y;
public:
//当一个类型中提供了虚函数,则编译器会自动提供一个指针类型的成员来管理这个数据,这个指针交虚表指针。
virtual void show()
{
cout << "this is show A" << endl;
}
virtual void test()
{
}
};
int main()
{
cout << sizeof(A) << endl;
}
函数重写(函数覆盖)=>overwrite:当子类提供了和父类同名的虚函数时,称之为函数重写.
函数重写要求函数的返回值类型、函数名、参数列表必须完全相同.
名字隐藏(namehide)=>当子类提供了和父类同名的数据时叫名字隐藏.
函数重载=>同一个作用域中,函数名相同、参数列表不同的函数构成重载关系.
#include<iostream>
using namespace std;
class Animal
{
public:
void show()
{
cout << "animal show()" << endl;
}
virtual void run()
{
cout << "animal run()" << endl;
}
};
class Cat :public Animal
{
public:
//名字隐藏,返回值可以不同
//int show()
//{
// cout << "this is cat show()" << endl;
//}
//函数重写,返回值类型必须相同
//一虚则全虚,可省略关键字virtual
void run()
{
cout << "this is cat run" << endl;
}
};
int main()
{
Animal a;
a.show();
a.run();
Cat cat;
cat.show();
cat.run();
Animal *pcat = new Cat();
pcat->show();
pcat->run();
}