d继承链中忽略了模板插件

import core.stdc.stdio;

class A
{
    void visit(int a){ printf("A - int\n");}
    void visit(float b) { printf("A - float\n");}
}

mixin template Bmix(AST)
{

    // 移动进B
    override void visit(int a) {printf("B - int\n");}
    override void visit(float b) {printf("B - float\n"); super.visit(b);}
}

class B : A!int
{
    alias visit = A!int.visit;
    mixin Bmix!int;
}

class C : B 
{
    alias visit = B.visit;
    override void visit(float b)
    {   
        printf("C - float\n");
        super.visit(b);
    }   
}

void main()
{
    C vis = new C();
    float c = 7.0;
    vis.visit(c);
}

//输出:
C - float
A - float

把两个访问方法,单独移进去,则为

C - float
B - float
A - float

import std.stdio;
class A
{
    void f(){ writeln("A.f"); }
}
class B: A
{
    alias f = A.f;
    mixin X!();
}
mixin template X()
{
    override void f(){ writeln("B.f"); super.f(); }
}
class C: B
{
    override void f(){ writeln("C.f"); super.f(); }
}
void main()
{
    (new C).f();
}

同样,

C.f
A.f
//期望的是
C.f
B.f
A.f

ParseTimeTransitiveVisitor用插件访问,影响dmd作为库.
别名使事情复杂了.模板插件按名工作,f已在那,说明覆盖了模板插件版的f.B.f不是虚树的一部分,所以没有错.你可以别名两个:

class B: A
{
    alias f = A.f;
    alias f = x.f;
    mixin X!() x;
}

两个f构成重载集.

posted @   zjh6  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示