
C++一道练习题
18.下面程序的输出结果是(C)#include<iostream>usingnamespacestd;classBase{public:virtualvoidf(){c...
18. 下面程序的输出结果是( C )
#include <iostream>
using namespace std;
class Base
{
public:
virtual void f() { cout << “f0+”; }
void g() { cout << “g0+”; }
};
class Derived : public Base
{
public:
void f() { cout << “f+”; }
void g() { cout << “g+”; }
};
void main() { Derived d; Base *p = &d; p->f(); p->g(); }
A)f+g+ B)f0+g+ C)f+g0+ D)f0+g0+
能详细解释一下么?
如果~
class Derived : public Base
{
public:
void f() { cout << “f+”; }
void g() { cout << “g+”; }
void M(){cout << “m+”; }//通过指针pBase *p = &d调用派生类中多出的函数怎么弄?
}; 展开
#include <iostream>
using namespace std;
class Base
{
public:
virtual void f() { cout << “f0+”; }
void g() { cout << “g0+”; }
};
class Derived : public Base
{
public:
void f() { cout << “f+”; }
void g() { cout << “g+”; }
};
void main() { Derived d; Base *p = &d; p->f(); p->g(); }
A)f+g+ B)f0+g+ C)f+g0+ D)f0+g0+
能详细解释一下么?
如果~
class Derived : public Base
{
public:
void f() { cout << “f+”; }
void g() { cout << “g+”; }
void M(){cout << “m+”; }//通过指针pBase *p = &d调用派生类中多出的函数怎么弄?
}; 展开
3个回答
展开全部
C
f()是虚函数,运行的时候根据指针指向的对象动态绑定,指针指向子类对象,所以 f+
g()不是虚函数,编译的时候静态绑定,父类对象指针,就调用父类对应函数。g0+
f()是虚函数,运行的时候根据指针指向的对象动态绑定,指针指向子类对象,所以 f+
g()不是虚函数,编译的时候静态绑定,父类对象指针,就调用父类对应函数。g0+
追问
Base *p = &d; p->f(); p->g(); 怎么理解?
追答
用基类指针调用基类存在的函数。但是这个函数具体是基类实现的还是子类实现的就看函数是不是虚函数了。基类没有的函数,不能用基类指针 直接 调用。有一个 间接 办法,f是虚函数,在子类中的f函数调用m,就可以了。
展开全部
virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
你可以理解为Base中带virtual 函数被下方Derived同名的f()覆盖了。
你可以理解为Base中带virtual 函数被下方Derived同名的f()覆盖了。
追问
Base *p = &d; p->f(); p->g(); 怎么理解?
追答
多出的函数。 这个不需要问。 自己试一下不就知道结果了。
其实程序很多不理解的地方 都是通过试出来的。
自己弄出来的东西,印象最深。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
调用多出的函数编译通不过,因为p是指向base的指针,base中没有M。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询