(请教)继承普通类和模板类的一个问题(关于类作用域)

chenbin200818 2011-07-08 04:19:22
请看代码

1: 普通类---------------------------------
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;

class A
{
int a;
public:
A(int aa = 19) : a(aa){ }
int get_value_A() const { return a; }
};

class B: public A
{
public:
B() : A(40) { }

int get_value()
{
return get_value_A();
}
};

int main(int argc, char* argv[])
{
B b;
printf("%d\n", b.get_value());

return 0;
}

2: 模板类 -------------------------头文件----inherit_tem.h-------
#ifndef _AAAAAAAAAAA_
#define _AAAAAAAAAAA_
#include <iostream>
using namespace std;
template<class T, int ret = 6>
class A
{
T a;
int b;
public:
A(T& aa = 0) : a(aa), b(ret){ }
void print() const
{
cout << "A: " << a << endl;
}
int count() const{ return b; }
};


template<class T>
class B : public A<T>
{
public:
B(T& aa) : A<T>(aa){ }
void Bprint() const
{
A<T>::print();
}
void print_int() const
{
cout << "print_int " << A<T>::count() << endl;
}
};

#endif
-------------------源文件------------------
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "inherit_tem.h"

using namespace std;

int main(int argc, char* argv[])
{
int bb = 3;
B<int> b(bb);
b.Bprint();
b.print_int();

return 0;
}
.....................................................................
........................................................................
在继承模板类中 子类调用父类函数 为什么必须要加 父类作用域 A<T>:: 否则编译不过 ,而 普通类继承却不用加父类作用域
请教 我用的是g++ 4.4.5 GNU project C++ compiler
...全文
246 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pptor 2011-07-15
  • 打赏
  • 举报
回复
看了 有道理...
fukang258369 2011-07-10
  • 打赏
  • 举报
回复
有道理...[Quote=引用 5 楼 pengzhixi 的回复:]
因为print依赖模板参数,就是说你模板参数不同就会生成不同的print。所以你需要A<T>来指定下。
[/Quote]
motzyd 2011-07-10
  • 打赏
  • 举报
回复
模板和预处理差不多,都是对代码进行变换的,与处理是进行简单的替换和删除,是在编译前进行的,而模板是在编译期间进行的,所以能获得一些类型信息,它其实就是代入模板参数,然后复制模板代码,所以class A<int>是一套定义,class A<char>是另一套定义,这个你打开生成汇编码的开关看看就知道了
qq120848369 2011-07-10
  • 打赏
  • 举报
回复
根本就没问题.
healer_kx 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]

因为print依赖模板参数,就是说你模板参数不同就会生成不同的print。所以你需要A<T>来指定下。
[/Quote]

学习了。
chenbin200818 2011-07-08
  • 打赏
  • 举报
回复
5楼大能 有没有好的这方面的资料 看看
pengzhixi 2011-07-08
  • 打赏
  • 举报
回复
因为print依赖模板参数,就是说你模板参数不同就会生成不同的print。所以你需要A<T>来指定下。
chenbin200818 2011-07-08
  • 打赏
  • 举报
回复
模板类 子类中 将 A<T>::count() 改成 count() 试试
至善者善之敌 2011-07-08
  • 打赏
  • 举报
回复
我编辑出错。。。。。。。。
xiaohan1233 2011-07-08
  • 打赏
  • 举报
回复
看不懂
bdmh 2011-07-08
  • 打赏
  • 举报
回复
vs2005编译正常

65,187

社区成员

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

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