专业网站设计软件工具,wordpress使用原版编辑器,广州建设诚信评分网站,炫酷的移动端网站设计C的编译分为四步#xff0c;最终生成一个可执行文件。 C的运行#xff0c;就是将可执行文件交给操作系统#xff0c;按照机器码逐步执行#xff0c;运行功能。 先看一个非常非常有趣的例子#xff1a;
class Father{
public:virtual void f(){coutI am fat…C的编译分为四步最终生成一个可执行文件。 C的运行就是将可执行文件交给操作系统按照机器码逐步执行运行功能。 先看一个非常非常有趣的例子
class Father{
public:virtual void f(){coutI am fatherendl;}};class Son : public Father{
private:void f(){coutI am sonendl;}
};int main() {Father * ptr new Son;ptr-f();
}看起来是不被允许的访问私有成员。但是不仅可以编译通过而且输出的还是
I am son看起来非常非常的难以理解。 首先类是编译期间的概念所谓访问权限控制只发生在编译期间。对象分配内存才是运行期间概念。 Father * ptr new Son; ptr是动态类型因为存在虚函数和虚函数表所以变成了动态绑定。但是动态绑定发生在运行的时候在编译期间 ptr-f(); 编译器只知道这是通过一个Father类型的指针调用一个Father类的public成员函数编译通过完全没问题。 因为虚函数表的产生所以运行时实际调用的是Son类的私有成员函数但是运行时不关注访问类型如此一来毫无问题。
我想通过这个例子说明什么呢 代码中如果调用非虚函数那么在编译期间就已经明确了行为 代码中如果调用了虚函数那么在运行期间才会明确行为。