快速业务通道

C 模板类继承中诡异的作用域问题

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-28

C 模板类继承中诡异的作用域问题 由 tiger » 2009-08-19 18:30 下面一段代码,大家可以试试,这样的问题经常被人忽略,出错还很难查:
代码: 全选
/*
* template_scope.cpp
*
* Created on: 2009-8-19 下午06:13:28
* Author: kwarph
* Web: http://www.xuanyuan-soft.cn
* Mail: kwarph@gmail.com
*/

#include <iostream>
using namespace std;

int x = 8;

void print() {
cout << "hello" << endl;
}

template<typename T>
class B {
public:
B() :
x(0) {
}

explicit B(const int& v) :
x(v) {
}

void print() const {
cout << "B::print()" << endl;
}

protected:
int x;
};

template<typename T>
class A: public B<T> {
public:
void test_scope() const {
cout << "x = " << x << endl; // 引用全局的x,输出 x = 8
// cout << "x = " << B<T>::x << endl; // 显式调用父类的x

print(); // 调用全局的print(),输出 hello
// B<T>::print(); // 显式调用父类的函数
}
};

class C {
public:
C() :
x(0) {
}

explicit C(const int& v) :
x(v) {
}

void print() const {
cout << "C::print()" << endl;
}

protected:
int x;
};

class D: public C {
public:
void test_scope() const {
cout << "x = " << x << endl; // 用父类的x,输出: x = 0
print(); // 调用父类的print(),输出: C::print()
}
};

int main() {
A<int> a;
a.test_scope();

D d;
d.test_scope();
}


但是非模板类继承就没有这些问题.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号