一个可能很傻的问题

cpsoft 2003-12-09 06:45:51
class a
{
public:
a(int a,int b);
~a();
}

class b:public a
{
public:
b();
~b();
}

main()
{
b* pb;
pb=new b(10,20);
}

这样编译是通过不了的,但我需要实现这样的机制啊!
...全文
65 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
还有,麻烦我要实现这样的机制,而不是告诉我为什么不能实现!
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
麻烦告知哪本书.
wincf 2003-12-10
  • 打赏
  • 举报
回复
struct Bridge
{
int a;
int b;
Bridge(int i,int j):a(i),b(j){};
};

class A
{
public:
A(int p,int q)
{
fn();
};

~A(){};

public:
int fn()
{
i=1;
return i;
};
int i;
};

class B:public A
{
public:
B(Bridge tmp):A(tmp.a,tmp.b){};
~B(){};
int fn()
{
i=3;
};
};

int main()
{
int z;
B* pb=new B(Bridge(10,20));
z=pb->i;
delete pb;
return z;
};


// new B(Bridge(10,20) 先调用基类构造函数,里面调用了fn()
// 而他将i设为1,所以你得到结果为1
解决办法:
//将 int fn()...
//改为 virtual int fn()...
在构造函数中不要调用fn(),因为此时对象B尚未构造完成,调用的函数是不对的
pb->fn(); //这样调用
LinuxPanther 2003-12-10
  • 打赏
  • 举报
回复
楼主努力的学习呀。。
象这样的问题在书上是有讲的了。。
仔细的看书了。
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
struct Bridge
{
int a;
int b;
Bridge(int i,int j):a(i),b(j){};
};

class A
{
public:
A(int p,int q)
{
fn();
};

~A(){};

public:
int fn()
{
i=1;
return i;
};
int i;
};

class B:public A
{
public:
B(Bridge tmp):A(tmp.a,tmp.b){};
~B(){};
int fn()
{
i=3;
};
};

int main()
{
int z;
B* pb=new B(Bridge(10,20));
z=pb->i;
delete pb;
return z;
};

采用了你的方法,可z的答案还是1;
Jinhao 2003-12-10
  • 打赏
  • 举报
回复
如果没有B(int p1,int p2):A(p1,p2){}
就肯定不能pb=new b(10,20);
因为找不到b(10.20)与之匹配的函数

“因为如果是显式调用A(p1,p2)的话其内部不会调用B重载的函数”
对于这个问题可以走一个弯路
struct Bridge
{
int a;
int b;
Bridge(int i,int j):a(i),b(j){}
};
class A
{
public:
A(int,int){}
};
class B:public A
{
public:
B(Bridge tmp):A(tmp.a,tmp.b){}
};

int main()
{
B* pb=new B(Bridge(10,20));
......
delete pb;
}
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
谢谢 byyyyy(苦行僧) 替我补全代码,可惜我问题的重点不在这里.
谢谢 jeckyz(深圳) 给我的提醒,这点确实是我以前没有考虑到的.
也谢谢各位为我推荐的书,
虽然我确有半年没编程,但你们说的书我还是都看过的.
由于提问提的仓促所以有那么多漏洞,各位见谅
其实,我想问的是在class b没有实现B(int p1,int p2):A(p1,p2){}构造函数的情况下,
能不能让pb=new b(10,20);自动调用Class a的A(int a,int b):i(a),j(b){}
B(int p1,int p2):A(p1,p2){}这种方案不可行,
因为如果是显式调用A(p1,p2)的话其内部不会调用B重载的函数
所以还是请大虾们继续帮忙!!!!!!!1
jeckyz 2003-12-09
  • 打赏
  • 举报
回复
我补充一点:基类应该是抽象类才对,也就是说类 a 应该是个抽象类,更直接的说法是释构函数应该是 virtual 的.我总结了一下,分两点来解释其必要性:

1)为了能自动释构基类的资源;

// example 1
class a
{
public:
a( const char* str )
: m_str( new( nothrow ) char[ strlen( str ) + 1 ] )
{ strcpy( m_str, str ); }

virtual ~a( )
{
if ( m_str != 0 )
{
delete [ ] m_str;
m_str = 0;
}
}

private:
char* m_str;
};

class b : a
{
b( const char* str ) : a( str ) { }
}

只有这样,当释构一个 b 对象时,基类 a 的资源才会自动释放。

2)为了能自动释构派生类类的资源;

上例是说只有基类的释构函数为虚,释构派生类对象时才会自动调用基类释构函数。但有时并不是这样,假如基类没有必要的资源需要释放时呢?我们说,同样还应是虚的,请看:

struct a
{
virtual ~a( ) { };
};

class b : a
{
b( const char* str )
: m_str( new( nothrow ) char[ strlen( str ) + 1 ] )
{ strcpy( m_str, str ); }

virtual ~b( )
{
if ( m_str != 0 )
{
delete [ ] m_str;
m_str = 0;
}
}

private:
char* m_str;
}

a* obj = new b( "for test" );
delete obj; // 只有 a 的释构函数是虚的,派生类的释构函数才会调用。

qiaojicheng 2003-12-09
  • 打赏
  • 举报
回复
class a
{
public:
a(int a,int b);//一没有写实现,导致链接出错,编译可以通过
~a();//二没有写实现
}//三没有写分号,类定义不完整,编译出错

class b:public a
{
public:
b();//同上一
~b();//同上二
}//同上三

main()
{
b* pb;
pb=new b(10,20);//b没有相应的构造函数,编译出错。
}
照 Jinhao(辣子鸡丁) 修改就对了。
另:
楼主该多看看基础知识!!
computer386 2003-12-09
  • 打赏
  • 举报
回复
每个人都是从那个时候过来的!!!!!!!!!!!!!!!!!
好好努力!!!!!!!!!!!!!!!!!!!!!!!!!!
byyyyy 2003-12-09
  • 打赏
  • 举报
回复
建议楼主看看谭浩强编的《C++程序设计教程》下册。
我觉得挺好的。
byyyyy 2003-12-09
  • 打赏
  • 举报
回复
class a
{
public:
a(int a,int b);//应该定义实现
~a();//析构应该有内容
} // 应该有分号!!!!

class b:public a
{
public:
b();//构造函数的继承性
~b();
} // 应该有分号!!!!

main()
{
b* pb;
pb=new b(10,20);
}

/////////////////////////////////////////////
class a
{
public:
int j;
int k;
a(int m,int n);
{
j = m;
k = n;
}
//~a();
};

class b:public a
{
public:
b(int m, int n):a(m, n)
{}
~b();
};

main()
{
b* pb;
pb=new b(10,20);
}
就可以了。
我也是初学者。有什么不对的地方请指正。
Jinhao 2003-12-09
  • 打赏
  • 举报
回复
想问问题就不要怕傻
#include<iostream>
using namespace std;

class A
{
public:
int i,j;
A(int a,int b):i(a),j(b){}
~A(){}
};

class B:public A
{
public:
B(int p1,int p2):A(p1,p2){}
~B(){}
};

int main()
{
B* pb;
pb=new B(10,20);
cout<<pb->i<<endl;
cout<<pb->j;
}
ThinkX 2003-12-09
  • 打赏
  • 举报
回复
你的程序漏洞百出,要是编译通过才怪呢!
回去看看基础书籍去!!!

64,633

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧