基类对象数组作为函数的参数 :派生类实参[i] 的问题
class baseA
{
void setData(int i);
}
class inheritB : public A
{
void setData(String str);
}
class inheritC : public A
{
void setData(String str);
}
function( baseA * pAry, int iCount )
{
String str;
for( int i = 0 ; i < iCount ; ++i ){
str=someText;
A[i].setData( str );//error 不可以,应该怎样实现??
}
}
//=====调用function========
main()
{
inheritB * objAry = new inheritB[5];
function(objAry, 5);
}
[解决办法]
Scott Meyer说:永远不要在把数组和多态混用。
Ps:你的Error与多态无关。
[解决办法]
A[i].setData( str );//error 不可以,应该怎样实现??
===============================
(A+i)-> setData( str );
如果楼住想多态的话, setData父子的参数应该一样...
[解决办法]
#include <string>
#include <iostream>
using namespace std;
class A
{
public:
virtual void Display(){ cout < < "A " < < endl;}
};
class B : public A
{
public:
void Display(){ cout < < "B " < < endl;}
};
class C : public A
{
public:
void Display(){ cout < < "C " < <endl; }
};
Fun (A* p)
{
for (int i=0; i <5; i++)
{
(p+i)-> Display();
}
}
main()
{
A* p = new B[5];
Fun(p);
return;
}
参考..
[解决办法]
楼上的代码会出错的,而且是运行时错误。
[解决办法]
还是认真去看More Effective C++ item3吧。
[解决办法]
在baseA中声明一个virtual void setData(String str);就可以了!多态这个方面就可以了.
function中计算数组地址会出错的(sizeof(A)和sizeof(B)不一样的时候);
A[0]的地址是正确的,A[1]以后的就会出错了.因为它是从A[1]的地址是A[0]的地址加上sizeof(A);
而B[1]是objAry[1]的地址 是objAry[0]的地址加上sizeof(B),这样一来,地址就计算错了.
这里A[0]的地址与objAry[0]的地址是相等的;
下面是用指针的指针实现的一段代码!
可以作为参考
#include <iostream.h>
class A
{
public:
virtual void fun();
private:
int m_a;
};
class B : public A
{
public:
void fun();
private:
int m_b;
};
void A::fun()
{
cout < < "A " < <endl;
}
void B::fun()
{
cout < < "B " < <endl;
}
void testfun(A**AAry,int count)
{
for(int i = 0 ; i < count ; ++i)
{
AAry[i]-> fun();
}
}
int main(int argc,char* argv[])
{
B** ppB = new B*[5];
for(int i = 0 ; i < 5 ; ++i)
{
ppB[i] = new B();
}
testfun((A**)ppB,5);
return 0;
}
[解决办法]
To classpatterns:
给类A和类B设定不同的数据成员,使得它们的实例大小有区别,再试一次看看。
[解决办法]
BluntBlade(信仰迷离·重构之道,在于Redo/Undo之间) ( ) 信誉:105 Blog 2007-03-02 11:08:39 得分: 0
楼上的代码会出错的,而且是运行时错误。
======================================================
你试一下 结果正确啊...
虽然前辈教导我们 不要那样, 但是结果真的正确啊....
=========================================================================
结果正确那是因为你的类里面只有函数,没有变量,当然可以正确的取得地址了.
给A和B分别加上两个变量再试一下?并且在函数里把这两个变里显示出来,看看结果如何
[解决办法]
#include <vector>
using namespace std;
class baseA
{
void setData(int i);
}
class inheritB : public A
{
void setData(String str);
}
class inheritC : public A
{
void setData(String str);
}
function(vector <baseA*> pAry, int iCount )
{
String str;
for( int i = 0 ; i < iCount ; ++i ){
str=someText;
pAry[i].setData( str );//error 不可以,应该怎样实现??
}
}
//=====调用function========
main()
{
vector <baseA*> objAry;
for (int i = 0; i < 5; ++i)
{
objAry.push_back(new inheritB);
}
function(objAry, 5);
for (int i = 0; i < 5; ++i)
{
delete objAry[i];
}
}
[解决办法]
class A
{
public:
virtual void setData(string str){}
};
class inheritB : public A
{
public:
void setData(string str)
{
cout < < str < < endl;
}
};
void function( A* pAry, int iCount )
{
string str;
for( int i = 0 ; i < iCount ; ++i )
{
str = "someText ";
pAry[i].setData(str);//error 不可以,应该怎样实现??
}
}
//=====调用function========
int main()
{
A* objAry = new inheritB[5];
function(objAry, 5);
return 1;
}
