首页 > 编程语言 >c++,真有趣啊

c++,真有趣啊

时间:2022-10-30 01:44:05浏览次数:39  
标签:__ pDerived c++ class CFactory CBase 有趣 fooV

由于笔者的水平不太行,在这个贴里记录一些自己犯过的不太容易被发现的错误

20221029

基类
class CBase
{
public:
    virtual ~CBase() {}

private:
    virtual bool __fooV() { return true; }

    friend class CFactory;
};
继承类
class CDerived : public CBase
{
private:
    virtual bool __fooV(int x) { return x > 100; }

    friend class CFactory;
};
工厂类
class CFactory
{
public:
    template <typename TDerived, class... TArgs>
    requires std::is_base_of<CBase, TDerived>::value
    static TDerived* createResource(TArgs&&... vArgs)
    {
        TDerived* pDerived = new TDerived();
        assert(pDerived);

        CBase* pBase = pDerived;

        bool IsInitSucceed;
        if (sizeof...(vArgs) > 0) IsInitSucceed = pDerived->__fooV(std::forward<TArgs>(vArgs)...);
        else                      IsInitSucceed = pBase->__fooV();

        if (!IsInitSucceed)
        {
            delete pDerived;
            pDerived = nullptr;
        }

        return pDerived;
    }
};
CDerived* pDerived = CFactory::createResource<CDerived>();

期望:在函数 CFactory::createResource 的实例化中,由于模板参数包的大小为0,所以最后当然会执行else分支的部分,那么不管if部分的话,编译肯定是能顺利通过的吧?

事实:编译的时候可不会管哪些函数会不会被执行到,CBase::__fooV 对 CDerived 不可见,自然编译就失败了。

修改方法:在 CDerived 中override __fooV()

标签:__,pDerived,c++,class,CFactory,CBase,有趣,fooV
From: https://www.cnblogs.com/hinanawitenshi/p/16840364.html

相关文章

  • C++11 unistring 类(编码转换)
    C++11 的编码转换程序: #ifndefUNISTRING_HPP#defineUNISTRING_HPP#include<algorithm>#include<codecvt>#include<cstdio>#include<cstdarg>#include<i......
  • C++ Primer Plus学习笔记之复合类型(上)
    前言个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系。一直以来都很想深入学习一下C++,将其作为自己的主力开发语言。现在为......
  • C++求高精度pi(1)BBP公式
    C++求高精度pi(1)前言(之后再写)BBP公式由arctan1展开得到的莱布尼茨级数是一个交错级数,并且条件收敛而不绝对收敛,这注定了莱布尼兹级数方法会非常低效而BBP公式$$\sum......
  • C++ STL
    概述STL主要有container,algorithm和iterator三大部分构成容器用于存放数据对象算法用于操作容器中的数据对象迭代器是算法和容器之间的中介STL容器STL容器是一种数据结构......
  • Modf is not a member of std in C++
    ModfisnotamemberofstdinC++ 2minuteread OnthispageIntroductionPotentialcausesFix#1:AddiostreamtoyourdepedenciesFix#2:Usingnamesp......
  • python 与C++ 利用socket实现json数据传输
    单机python与C++程序利用socket实现json数据传输目录单机python与C++程序利用socket实现json数据传输需求实现方法的选择具体实现流程图示涉及到的技术1socket......
  • 一道有趣的组合数学问题
    背景:这道题原先是之前一次练习的问题,当时自己推公式推了很久最后看题解发现是一道组合数学问题,给了自己很多启发,特此记录原题链接简单描述题意就是给定一个矩形区域的......
  • C++ 实现argosort
    #include<bits/stdc++.h>usingnamespacestd;intmain(){intn=5,t;vector<int>a,b;for(inti=0;i<n;++i){scanf("%d",&t......
  • C++多继承下,派生类对象有几张虚函数表?
    #include<iostream>#include<string>#include<typeinfo>usingnamespacestd;//基类classBase1{public:Base1():x(1){}virtualvoidplay(){cout<<"Base1::p......
  • C/C++ 交换机管理命令实战
    #include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<conio.h>usingnamespacestd;structport{charname[16];i......