1. 继承时的调用顺序
当创建子类对象时,先调用父类的构造函数,再调用子类的构造函数。
#include <iostream>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "调用Animal()构造函数" << endl;
}
};
class Dog: public Animal
{
public:
Dog()
{
cout << "调用Dog()构造函数" << endl;
}
};
int main()
{
Dog wangcai; //"调用Animal()构造函数", 调用Dog()构造函数
}
2. 访问权限与继承权限
访问权限和继承权限共有三种,从权限角度来看,public > protected > private, 访问权限和继承权限不同时,子类的访问权限取决于两者间较低的那个。
3. 函数遮蔽
1). 若子类中的成员函数与父类中的成员函数相同,此时子类对象.函数名,调用的是子类的成员函数,父类成员函数被遮蔽。
#include <iostream>
using namespace std;
class Animal
{
public:
void func1()
{
cout << "调用Animal::func1()" << endl;
}
};
class Dog: public Animal
{
public:
void func1()
{
cout << "调用Dog::func1()" << endl;
}
};
int main()
{
Dog wangcai;
wangcai.func1(); //子类的成员函数与父类的成员函数重名,此时调用的是子类的成员函数
}
2).可以在子类成员函数中利用父类::函数名来强制调用父类的同名成员函数。
#include <iostream>
using namespace std;
class Animal
{
public:
void func1()
{
cout << "调用Animal::func1()" << endl;
}
};
class Dog: public Animal
{
public:
void func1()
{
cout << "调用Dog::func1()" << endl; //调用Dog::func1()
Animal::func1(); //调用Animal::func1()
}
};
int main()
{
Dog wangcai;
wangcai.func1();
}
3).通过using关键字让父类同名函数在子类中可见
#include <iostream>
using namespace std;
class Animal
{
public:
void func1()
{
cout << "调用Animal::func1()" << endl;
}
void func1(int)
{
cout << "调用Animal::func1(int)" << endl;
}
};
class Dog: public Animal
{
public:
void func1()
{
cout << "调用Dog::func1()" << endl; //调用Dog::func1()
}
public:
using Animal::func1; //将父类的同名函数暴露出来,子类可见
};
int main()
{
Dog wangcai;
wangcai.func1(12); //调用Animal::func1(int),子类中没有void func1(int),此时调用父类中的void func1(int)
wangcai.func1(); //调用Dog::func1(),子类中有void func1(),仍会遮蔽父类中相同的函数,此时调用子类中的void func1(int)
}
说明:
(1) using Animal::func1这种方式只能指定函数名,不能指定参数个数,参数类型,即父类中的所有同名函数都会被暴露,都在子类中可见。
(2)若子类中的函数与父类中函数完全相同(未发生重载),此时,子类对象.函数名,调用的仍是子类的成员函数,父类成员函数被遮蔽。
(3)using的引入主要是为了实现在子类对象中调用父类成员函数的重载版本。
#include <iostream>
using namespace std;
class Animal
{
public:
void func1()
{
cout << "调用Animal::func1()" << endl;
}
void func1(int)
{
cout << "调用Animal::func1(int)" << endl;
}
void func1(int, int)
{
cout << "调用Animal::func1(int, int)" << endl;
}
};
class Dog: public Animal
{
public:
void func1()
{
cout << "调用Dog::func1()" << endl; //调用Dog::func1()
}
public:
using Animal::func1; //将父类的同名函数func1(),void func1(int), void func1(int,int)全部暴露出来,子类可见
};
int main()
{
Dog wangcai;
wangcai.func1(); //调用Dog::func1(),子类中有void func1(),仍会遮蔽父类中相同的函数,此时调用子类中的void func1(int)
wangcai.func1(12); //调用Animal::func1(int),子类中没有void func1(int),此时调用父类中的void func1(int)
wangcai.func1(12, 12);//调用Animal::func1(int, int), 子类中没有void func1(int, int),此时调用父类中的void func1(int,int)
}