C++:派生类访问模板化基类(templatized base class)的命名

派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名.

原因是模板的定制化有可能取消某些函数, 为了能在编译期检测出错误, 所以默认无法访问.

派生类访问模板化基类, 包含三种方法:

1. 调用基类函数时, 使用"this->", 指明调用的类, 是本类, 在编译时, 可以进行检查;

2. 使用using声明式, 可以把基类的函数引入派生类, 在编译时, 可以进行检查;

3. 使用显示修饰(explicit qualification), 不推荐, 显示修饰会屏蔽virtual的动态绑定;

本例为: 派生类, 调用基类的函数, 重写修改格式, 进行输出;

代码:

/*
 * test.cpp
 *
 *  Created on: 2014.04.18
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <string>
#include <memory>  

using namespace std;  

class CompanyCaroline {
public:
    void sendCleartext(const std::string& msg) {
        std::cout << "Cleartext: " << msg << std::endl;
    }
    void sendEncrypted(const std::string& msg) {
        std::cout << "Encrypted: " << msg << std::endl;
    }
};  

struct MsgInfo {
    std::string cleartext;
    std::string encrypted;
};  

template<typename Company>
class MsgSender {
public:
    void sendClear(const MsgInfo& info) {
        std::string msg = info.cleartext;
        Company c;
        c.sendCleartext(msg);
    }
    void sendSecret(const MsgInfo& info) {
        std::string msg = info.encrypted;
        Company c;
        c.sendEncrypted(msg);
    }
};  

template<typename Company>
class LoggingMsgSender : public MsgSender<Company> {
public:
    //using MsgSender<Company>::sendClear; //方法二
    void sendClearMsg(const MsgInfo& info) {
        std::cout << "Log Begin : ";
        //sendClear(info);
        this->sendClear(info); //方法一
        //MsgSender<Company>::sendClear(info); //方法三, 会关闭虚绑定的行为, 不建议
    }
};  

int main() {
    MsgInfo mi = {"Clear", "Encrypted"};
    LoggingMsgSender<CompanyCaroline> lms;
    lms.sendClearMsg(mi);  

    return 0;
}

输出:

Log Begin : Cleartext: Clear

作者:csdn博客 Spike_King

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 编译
, 函数
, include
, 模板
, 类模板
, 编译期c++编译器
, 函数命名  检查 工具
检查
c class base、base class undefined、base class、virtual base class、qt base class,以便于您获取更多的相关知识。

时间: 2016-11-14

C++:派生类访问模板化基类(templatized base class)的命名的相关文章

C++箴言:如何访问模板化基类中的名字

假设我们要写一个应用程序,它可以把消息传送到几个不同的公司去.消息既可以以加密方式也可以以明文(不加密)的方式传送.如果我们有足够的信息在编译期间确定哪个消息将要发送给哪个公司,我们就可以用一个 template-based(模板基)来解决问题: class CompanyA {public: ... void sendCleartext(const std::string& msg); void sendEncrypted(const std::string& msg); ...};cl

继承-C++,类模板作为基类派生及指针的问题。

问题描述 C++,类模板作为基类派生及指针的问题. **C++,类模板作为基类派生某几个类,可不可以定义指向基类的指针,然后通过这个指针来指向各个派生类?大家帮忙解答一下.我是初学者,勿喷啊!** 以下面例子为例.C++的. #include<iostream> using namespace std; template<class T1> class A { protected: T1 a; public: virtual void output1(); virtual void

C#派生类为什么要重写基类问题

问题描述 派生类为什么要重写基类???直接定义不行吗???为什么要从基类重写呢? 解决方案 解决方案二:该回复于2015-05-26 19:28:26被版主删除解决方案三:软件是流程化的,不是堆一些硬件电路.因此软件跟人的智能一样,是需要"抽象"机制的.比如你说"我今天买鞋了,那么别人就不会非要逼着你说出是上工地的鞋.跑步的鞋.还是上夜店的鞋.在程序设计方面,如果你没有继承.多态设计的需求,那么相当于你的应用程序设计工程学完了不到十分之一,刚刚开始.将来学到了十分之一时,就是

编程-为什么派生类的指针指向基类对象 还可以调用派生类的函数?

问题描述 为什么派生类的指针指向基类对象 还可以调用派生类的函数? 想不明白啊,高手帮帮忙吧 Derived1 * hh = static_cast(new Base); hh->derivedfunction(); // 这里竟然是可以的 为什么呢 hh指向的是一个基类对象啊?? 而且即使derivedfunction里面用到派生类的私有成员也是可以的, 这到底是为什么啊??? 解决方案 虽然语法上让你通过了,static_cast是强制类型转换,所以语法没办法阻止你错误的做法,但是实际运行结

如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。

问题描述 如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错. class Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName(){ return name; } pu

如何在派生类中的隐藏基类的虚拟重载函数

我创建了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码如下: #include <iostream.h>class B {private: int nNumber;public: virtual void test() { cout << "B::test()\n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::te

Asp.Net 通用数据操作类 (附通用数据基类)第1/2页_实用技巧

文章内容为本站编辑,创作.你可以任意转载.发布.使用但请务必以明文标注文章原始出处及本声明 http://www.opent.cn  作者:浪淘沙此贴的方法会持续更新, 此文件要引用与数据操作的基类 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.Web

Asp.Net 数据操作类(附通用数据基类)_实用技巧

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; namespace EC {

派生类与派生类对象对基类成员的访问

区分"派生类对象"和"派生类"对基类成员的访问权限.    "派生类对象"对基类成员的访问权限:      (1)对于公有继承,只有基类的公有成员可以被"派生类对象"访问,其他(保护和私有)成员不能被访问.      (2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象"访问.    "派生类"对基类中成员的访问权限:     (1)对于公有继承,基类中的公有成员和保护成