继承
#include <iostream>
#include <string>
using std::cout;
using std::endl;
#if 0
class Person {
public:
void print() {
cout << "I am person " << endl;
cout << "name: " << name << endl;
cout << "age: " << age << endl;
}
protected:
std::string name;
int age;
};
class Student : public Person {
protected:
int stuid;
};
class Teacher : public Person {
protected:
int jobid;
};
int main() {
Student s;
Teacher t;
s.print();
t.print();
return 0;
}
#endif
#if 0
class Person {
protected:
std::string name;
std::string sex;
int age;
};
class Student : public Person {
public:
int no;
};
void Test() {
Student sobj;
Person pobj = sobj;
Person *pp = &sobj;
Person& rp = sobj;
pp = &sobj;
Student *psob = (Student*)pp;
psob->no = 10;
pp = &pobj;
Student *psob2 = (Student*)pp;
psob2->no = 10;
}
#endif
#if 0
class Person {
protected:
std::string name = "张龙";
int age = 20;
};
class Student : public Person {
public:
void print() {
cout << "name : " << name << endl;
cout << "age : " << Person::age << endl;
cout << "age : " << age << endl;
}
protected:
int age = 100;
};
void TestInh() {
Student s1;
s1.print();
}
class A {
public:
void fun() {
cout << "A fun" << endl;
}
};
class B : public A {
public:
void fun(int i) {
A::fun();
cout << " B fun i = " << i <<endl;
}
};
void T() {
B b;
b.fun(1);
}
int main() {
T();
return 0;
}
#endif
#if 0
class Student;
class Person {
public:
friend void display(const Person& p, const Student& s);
protected:
std::string name;
};
class Student : public Person {
protected:
std::string num = " 001";
};
void display(const Person& p, const Student& s) {
cout << p.name << endl;
}
#endif
#if 0
class Person {
public:
Person() {
count++;
}
protected:
std::string name;
public:
static int count;
};
int Person::count = 0;
class Student : public Person {
protected:
int num;
};
class Teacher : public Person {
protected:
std::string sex;
};
void TestStatic() {
Student s1;
Student s2;
Student s3;
Student s4;
Teacher t1;
cout << "count = " << Person::count << endl;
cout << "cout = " << Student::count << endl;
Teacher::count = 0;
cout << "count = " << Person::count << endl;
cout << "cout = " << Student::count << endl;
}
int main() {
TestStatic();
return 0;
}
#endif
#if 0
class Person {};
class Student : public Person{};
class Teacher : public Person{};
class Assiant : public Student,public Teacher{};
#endif
#if 0
class Person {
public:
std::string name;
};
class Student : public Person {
protected:
int num;
};
class Teacher : public Person {
protected:
int id;
};
class Assiant : public Student, public Teacher {
protected:
std::string majo;
};
void Testl() {
Assiant a;
}
class A {
public:
int a;
};
class B : virtual public A{
public:
int b;
};
class C : virtual public A {
public:
int c;
};
class D : public B, public C {
public:
int d;
};
int main() {
D d;
d.B::a = 1;
d.C::a = 2;
d.b = 3;
d.c = 4;
d.d = 5;
d.a = 6;
cout << d.B::a << endl;
cout << d.C::a << endl;
cout << d.a << endl;
return 0;
}
#endif
多态
#include <iostream>
using namespace std;
#if 0
class A {
public:
virtual void Buy() {
cout << "花钱 买东西 " << endl;
}
};
class B : public A {
public:
virtual void Buy() {
cout << "B extends A" << endl;
}
};
void Fun(A& a) {
a.Buy();
}
int main() {
A a;
B b;
Fun(a);
Fun(b);
return 0;
}
#endif
#if 0
class A{};
class B :public A{};
class C {
public :
virtual A* f() { return new A; }
};
class D :public C {
public:
virtual B* f() { return new B; }
};
class Car {
virtual void Drive() final{}
};
class Benz : public Car {
public:
};
class Car {
virtual void Drive() {}
};
class Benz : public Car {
public:
virtual void Drive() override { cout << " DADA1" << endl; }
};
#endif
#if 0
class Car {
public:
virtual void dirve() = 0;
};
class Bz : public Car {
public:
virtual void dirve() {
cout << "bz" << endl;
}
};
class BMW : public Car {
public:
virtual void dirve() {
cout << "BMW" << endl;
}
};
void TestCa() {
Car* pb = new Bz;
pb->dirve();
Car* pw = new BMW;
pw->dirve();
}
int main() {
TestCa();
return 0;
}
#endif
#if 0
class Base {
public:
virtual void Func1() { cout << "Base Func1()" << endl; }
virtual void Func2() { cout << "Base Func2()" << endl; }
void Func3() { cout << "Base Func3()" << endl; }
private:
int _b = 1;
};
class Derive : public Base {
public:
virtual void Func1() { cout << "Derive Func1()" << endl; }
private:
int id = 2;
};
int main() {
Base b;
Derive d;
return 0;
}
#endif
#if 0
class Base {
public:
virtual void Func1() { cout << "Base Func1()" << endl; }
virtual void Func2() { cout << "Base Func2()" << endl; }
private:
int a;
};
class Derive : public Base {
public:
virtual void Func1() { cout << "Derive Func1()" << endl; }
virtual void Func3() { cout << "Derive Func3()" << endl; }
virtual void Func4() { cout << "Derive Func4()" << endl; }
private:
int b;
};
typedef void(*VFPTR)();
void printVTable(VFPTR vTable[]) {
cout << "虚表地址 > " << vTable << endl;
for (int i = 0; vTable[i] != nullptr; i++) {
printf("第 %d 个虚函数地址: 0X%x,->", i,vTable[i] );
VFPTR f = vTable[i];
f();
}
cout << endl;
}
int main() {
Base b;
Derive d;
VFPTR* vTable = (VFPTR*)(*(int*)&b);
printVTable(vTable);
VFPTR* vTable1 = (VFPTR*)(*(int*)&d);
printVTable(vTable1);
return 0;
}
#endif
#if 0
class Base1 {
public:
virtual void Func1() { cout << "Base1 Func1()" << endl; }
virtual void Func2() { cout << "Base1 Func2()" << endl; }
private:
int a1;
};
class Base2 {
public:
virtual void Func1() { cout << "Base2 Func1()" << endl; }
virtual void Func2() { cout << "Base2 Func2()" << endl; }
private:
int a2;
};
class Derive : public Base1,public Base2 {
public:
virtual void Func1() { cout << "Derive Func1()" << endl; }
virtual void Func3() { cout << "Derive Func3()" << endl; }
private:
int b;
};
int main() {
Derive d;
cout << sizeof(d) << endl;
return 0;
}
#endif
#if 0
class Super {
public:
virtual void Func1() { cout << "Super Func1()" << endl; }
private:
int o1;
};
class Base1 :virtual public Super {
public:
virtual void Func1() { cout << "Base1 Func1()" << endl; }
virtual void Func2() { cout << "Base1 Func2()" << endl; }
private:
int a1;
};
class Base2 : virtual public Super {
public:
virtual void Func1() { cout << "Base2 Func1()" << endl; }
virtual void Func2() { cout << "Base2 Func2()" << endl; }
private:
int a2;
};
class Derive :public Base1,public Base2 {
public:
virtual void Func1() { cout << "Derive Func1()" << endl; }
virtual void Func3() { cout << "Derive Func3()" << endl; }
private:
int c = 1;
};
int main() {
Derive d;
return 0;
}
#endif