基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;反之如果定
义的虚函数,则通过指针调用的该同名函数是在指针指向的对象中定义的。
摘自:http://www.csdn.net/develop/article/11/11908.shtm
原文作者:fireseed
8 个解决方案
#1
应该没有错把,可以自己写个程序试试看就知道了
#2
如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
#3
正确!
定义了许函数,指针的方法引用是根据指针指向的对象的类型来引用函数的
如果没有定义许函数,那么按指针本身定义类型引用对象的方法的。例如:
clas A
{
public :
virtual d();
};
class B:public A
{
public
d();
};
B b;
A *p =b;
p->d();
如果A的d不是许函数,那么调用A的d,如果是调用B的d,因为指针指向B类型对象
定义了许函数,指针的方法引用是根据指针指向的对象的类型来引用函数的
如果没有定义许函数,那么按指针本身定义类型引用对象的方法的。例如:
clas A
{
public :
virtual d();
};
class B:public A
{
public
d();
};
B b;
A *p =b;
p->d();
如果A的d不是许函数,那么调用A的d,如果是调用B的d,因为指针指向B类型对象
#4
我认为没有问题!你用下边的代码测试一下就行了!
#include <iostream>
using namespace std;
class a{
public:
void pout(){cout<<"基类"<<endl;}//注意这里
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
第二种情况
#include <iostream>
using namespace std;
class a{
public:
virtual void pout(){cout<<"基类"<<endl;}//注意这里有virtual
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
#include <iostream>
using namespace std;
class a{
public:
void pout(){cout<<"基类"<<endl;}//注意这里
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
第二种情况
#include <iostream>
using namespace std;
class a{
public:
virtual void pout(){cout<<"基类"<<endl;}//注意这里有virtual
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
#5
喂!楼上的有没有试过啊!
B b;
A *p =b;
这什么呀!
B b;
A *p =b;
这什么呀!
#6
是楼上的楼上~(:
#7
如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
试一下
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){cout<<"A"<<endl;}
};
class B:public A
{
public:
void f(){cout<<"B"<<endl;}
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
A* a=new B;
a->f();
int i;
return 0;
}
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
试一下
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){cout<<"A"<<endl;}
};
class B:public A
{
public:
void f(){cout<<"B"<<endl;}
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
A* a=new B;
a->f();
int i;
return 0;
}
#8
谢谢各位的帮助,我现在终于弄清楚了!
#1
应该没有错把,可以自己写个程序试试看就知道了
#2
如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
#3
正确!
定义了许函数,指针的方法引用是根据指针指向的对象的类型来引用函数的
如果没有定义许函数,那么按指针本身定义类型引用对象的方法的。例如:
clas A
{
public :
virtual d();
};
class B:public A
{
public
d();
};
B b;
A *p =b;
p->d();
如果A的d不是许函数,那么调用A的d,如果是调用B的d,因为指针指向B类型对象
定义了许函数,指针的方法引用是根据指针指向的对象的类型来引用函数的
如果没有定义许函数,那么按指针本身定义类型引用对象的方法的。例如:
clas A
{
public :
virtual d();
};
class B:public A
{
public
d();
};
B b;
A *p =b;
p->d();
如果A的d不是许函数,那么调用A的d,如果是调用B的d,因为指针指向B类型对象
#4
我认为没有问题!你用下边的代码测试一下就行了!
#include <iostream>
using namespace std;
class a{
public:
void pout(){cout<<"基类"<<endl;}//注意这里
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
第二种情况
#include <iostream>
using namespace std;
class a{
public:
virtual void pout(){cout<<"基类"<<endl;}//注意这里有virtual
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
#include <iostream>
using namespace std;
class a{
public:
void pout(){cout<<"基类"<<endl;}//注意这里
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
第二种情况
#include <iostream>
using namespace std;
class a{
public:
virtual void pout(){cout<<"基类"<<endl;}//注意这里有virtual
};
class b:public a{
public:
void pout(){cout<<"派生类"<<endl;}
};
void main()
{
b *t=new b;
a *c=new a;
c=t;
c->pout();
delete t;
delete c;
}
#5
喂!楼上的有没有试过啊!
B b;
A *p =b;
这什么呀!
B b;
A *p =b;
这什么呀!
#6
是楼上的楼上~(:
#7
如果没有把需要在派生类中重载的同名
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
试一下
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){cout<<"A"<<endl;}
};
class B:public A
{
public:
void f(){cout<<"B"<<endl;}
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
A* a=new B;
a->f();
int i;
return 0;
}
基类函数定义为虚函数,则当用基类定义的指针指向派生类对象的地址时(赋
值兼容规则),通过此指针调用的该同名函数是在基类中定义的;
不是这样的,调用的依然是派生类的函数。virtual 在基类中声明一次就行了
试一下
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){cout<<"A"<<endl;}
};
class B:public A
{
public:
void f(){cout<<"B"<<endl;}
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
A* a=new B;
a->f();
int i;
return 0;
}
#8
谢谢各位的帮助,我现在终于弄清楚了!